From af1d4c8e78904a0838ffe3d54637cb23b7fcc8d5 Mon Sep 17 00:00:00 2001 From: Quarto GHA Workflow Runner Date: Fri, 10 Apr 2026 18:18:53 +0000 Subject: [PATCH] Built site for gh-pages --- .nojekyll | 2 +- docs/api/prompt_strategies.chat_template.html | 37 +- docs/dataset-formats/conversation.html | 360 +++++++++---- search.json | 8 +- sitemap.xml | 494 +++++++++--------- 5 files changed, 533 insertions(+), 368 deletions(-) diff --git a/.nojekyll b/.nojekyll index f9903bf94..c47c88483 100644 --- a/.nojekyll +++ b/.nojekyll @@ -1 +1 @@ -7dd4c342 \ No newline at end of file +a6bc28b6 \ No newline at end of file diff --git a/docs/api/prompt_strategies.chat_template.html b/docs/api/prompt_strategies.chat_template.html index f2ec3587c..209bc339a 100644 --- a/docs/api/prompt_strategies.chat_template.html +++ b/docs/api/prompt_strategies.chat_template.html @@ -988,8 +988,43 @@ gtag('config', 'G-9KYCVJBNMQ', { 'anonymize_ip': true}); turns, turn_idx, tools=None, -) + content_only=False, + reasoning_only=False, +)

Locate the starting and ending indices of the specified turn in a conversation.

+
+
Parameters
+ ++++++ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
content_onlyboolIf True and the turn has reasoning_content (template_thinking_key), preserve reasoning_content in the dummy turn so the diff only captures the content field boundaries. This is needed for correct training_detail alignment when reasoning_content is present.False
reasoning_onlyboolIf True, preserve content in the dummy turn and replace reasoning_content with a dummy, so the diff only captures the reasoning_content field boundaries.False
+
tokenize_prompt
diff --git a/docs/dataset-formats/conversation.html b/docs/dataset-formats/conversation.html index 1489d8797..c36f5f978 100644 --- a/docs/dataset-formats/conversation.html +++ b/docs/dataset-formats/conversation.html @@ -929,6 +929,20 @@ Note datasets: - path: ... type: chat_template +
+
+
+ +
+
+Tip +
+
+
+

chat_template_jinja also accepts a file path to a .jinja2 file instead of an inline string:

+
chat_template_jinja: ./path/to/my_template.jinja2
+
+
@@ -948,16 +962,16 @@ Important
  • If you are using a template that has a different EOT (End-of-Turn) token from EOS token or multiple EOT tokens (like Mistral V7 Tekken), set the eot_tokens: config. The handling of EOT tokens follows train_on_eos: which defaults to turn.
-
eot_tokens:
-  - "[/INST]"
-  # - "[/SYSTEM_PROMPT]"
-
-datasets:
-  - path: ...
-    type: chat_template
-
-    # optional
-    train_on_eot: turn  # defaults read from train_on_eos (which defaults to turn)
+
eot_tokens:
+  - "[/INST]"
+  # - "[/SYSTEM_PROMPT]"
+
+datasets:
+  - path: ...
+    type: chat_template
+
+    # optional
+    train_on_eot: turn  # defaults read from train_on_eos (which defaults to turn)
@@ -988,16 +1002,16 @@ Note
  • Continuing from the previous example, if you want to train on all EOT token trainable turns but only last EOS token, set train_on_eos: last.
-
eot_tokens:
-  - "[/INST]"
-  # ...
-
-datasets:
-  - path: ...
-    type: chat_template
-
-    train_on_eos: last
-    train_on_eot: turn
+
eot_tokens:
+  - "[/INST]"
+  # ...
+
+datasets:
+  - path: ...
+    type: chat_template
+
+    train_on_eos: last
+    train_on_eot: turn
@@ -1015,48 +1029,48 @@ Tip

Using tool use

Instead of passing tools via the system prompt, an alternative method would be to have the tools in a separate column and loaded via chat_template to let the template dynamically build it.

-
{
-    "tools": [
-        {
-            "type": "...",
-            "function": {
-                "name": "...",
-                "description": "...",
-                "parameters": {
-                    "type": "...",
-                    "properties": {
-                        // ...
-                    },
-                    "required": ["..."],
-                },
-            },
-        },
-    ],
-    "messages": [
-        // ...
-        {
-            "role": "assistant", // call the function via assistant
-            "tool_calls": [
-                {
-                    "id": "...",  // required only for mistral
-                    "type": "function",
-                    "function": {
-                        "name": "...",
-                        "arguments": {
-                            "...": "...",
-                        }
-                    }
-                }
-            ]
-        },
-        {
-            "role": "tool",
-            "tool_call_id": "...",  // required only for mistral
-            "name": "...",
-            "content": "..."
-        },
-    ],
-}
+
{
+    "tools": [
+        {
+            "type": "...",
+            "function": {
+                "name": "...",
+                "description": "...",
+                "parameters": {
+                    "type": "...",
+                    "properties": {
+                        // ...
+                    },
+                    "required": ["..."],
+                },
+            },
+        },
+    ],
+    "messages": [
+        // ...
+        {
+            "role": "assistant", // call the function via assistant
+            "tool_calls": [
+                {
+                    "id": "...",  // required only for mistral
+                    "type": "function",
+                    "function": {
+                        "name": "...",
+                        "arguments": {
+                            "...": "...",
+                        }
+                    }
+                }
+            ]
+        },
+        {
+            "role": "tool",
+            "tool_call_id": "...",  // required only for mistral
+            "name": "...",
+            "content": "..."
+        },
+    ],
+}
@@ -1087,11 +1101,11 @@ Warning

Example config for Llama4:

-
chat_template: llama4
-datasets:
-  - path: Nanobit/text-tools-2k-test
-    type: chat_template
-    # field_tools: tools # default is `tools`
+
chat_template: llama4
+datasets:
+  - path: Nanobit/text-tools-2k-test
+    type: chat_template
+    # field_tools: tools # default is `tools`
@@ -1114,43 +1128,43 @@ Tip
data.jsonl
-
{
-  "conversations": [
-    {"from": "system", "value": "You are an AI assistant.", "train": false},
-    {"from": "human", "value": "Hello", "train": false},
-    {"from": "assistant", "value": "Hello", "train": true},
-    {"from": "human", "value": "How are you?", "train": true},
-    {
-      "from": "assistant",
-      "value": "I'm doing very well, thank you!",
-      "train_detail": [
-        {"begin_offset": 0, "end_offset": 8, "train": false},
-        {"begin_offset": 9, "end_offset": 18, "train": true},
-        {"begin_offset": 19, "end_offset": 30, "train": false},
-      ],
-    },
-    {
-        "from": "human",
-        "value": "I'm doing very well, thank you!",
-        "train": true,
-    },
-    {"from": "assistant", "value": "Hi there!", "train": true}
-  ]
-}
+
{
+  "conversations": [
+    {"from": "system", "value": "You are an AI assistant.", "train": false},
+    {"from": "human", "value": "Hello", "train": false},
+    {"from": "assistant", "value": "Hello", "train": true},
+    {"from": "human", "value": "How are you?", "train": true},
+    {
+      "from": "assistant",
+      "value": "I'm doing very well, thank you!",
+      "train_detail": [
+        {"begin_offset": 0, "end_offset": 8, "train": false},
+        {"begin_offset": 9, "end_offset": 18, "train": true},
+        {"begin_offset": 19, "end_offset": 30, "train": false},
+      ],
+    },
+    {
+        "from": "human",
+        "value": "I'm doing very well, thank you!",
+        "train": true,
+    },
+    {"from": "assistant", "value": "Hi there!", "train": true}
+  ]
+}

The configuration would look like:

-
datasets:
-  - path: ...
-    type: chat_template
-    chat_template: tokenizer_default
-    field_messages: conversations
-    message_property_mappings:
-      role: from
-      content: value
-    roles_to_train: []
-    train_on_eos: turn
-    message_field_training: train
-    message_field_training_detail: train_detail
+
datasets:
+  - path: ...
+    type: chat_template
+    chat_template: tokenizer_default
+    field_messages: conversations
+    message_property_mappings:
+      role: from
+      content: value
+    roles_to_train: []
+    train_on_eos: turn
+    message_field_training: train
+    message_field_training_detail: train_detail
@@ -1165,23 +1179,139 @@ Tip
+
+

Content parts with per-part training control

+

Instead of using character offsets with train_detail, you can split a message’s content into a list of parts, each with its own training flag. This is useful when you want to mask specific sections of a response (e.g., mask reasoning but train on the answer).

+
+
+
data.jsonl
+
+
{
+  "messages": [
+    {"role": "user", "content": [{"type": "text", "text": "What is 2+2?"}]},
+    {
+      "role": "assistant",
+      "content": [
+        {"type": "text", "text": "Let me think step by step...", "train": false},
+        {"type": "text", "text": " The answer is 4.", "train": true}
+      ]
+    }
+  ]
+}
+
+

The configuration is the same as standard chat_template — no extra fields needed:

+
datasets:
+  - path: ...
+    type: chat_template
+    roles_to_train: ["assistant"]
+

Each content part supports:

+
    +
  • type: "text" (required)
  • +
  • text: the text value (also accepts content or value as the key)
  • +
  • train: true/false (optional) — whether to train on this part
  • +
  • weight: 0/1 (optional) — alternative to train
  • +
+

If a part has no train or weight flag, it inherits the turn-level training decision (from roles_to_train, message_field_training, or train_on_inputs).

+
+
+
+ +
+
+WarningWhitespace at part boundaries +
+
+
+

BPE tokenizers (used by Llama, Qwen, Mistral, GPT, etc.) prepend spaces to word tokens. For example, " answer" is a single token — the space is part of it. This means where you place whitespace between content parts matters:

+

Split BEFORE spaces (space goes with the next part):

+
[
+  {"type": "text", "text": "Let me think...", "train": false},
+  {"type": "text", "text": " The answer is 4.", "train": true}
+]
+

DON’T put trailing spaces on a part (the space merges with the next word into one token that straddles the boundary, and straddling tokens are masked):

+
[
+  {"type": "text", "text": "Let me think... ", "train": false},
+  {"type": "text", "text": "The answer is 4.", "train": true}
+]
+

In the bad example, " The" becomes a single token that spans both parts. Because it straddles the boundary, it is conservatively masked (not trained) — even though the second part has train: true.

+

Newlines typically merge with preceding punctuation (e.g., ":\n" is one token). Keep newlines with the preceding part:

+
[
+  {"type": "text", "text": "Thinking:\n", "train": false},
+  {"type": "text", "text": "The answer is 4.", "train": true}
+]
+

Axolotl will log a warning if it detects trailing whitespace at a boundary between parts with different training flags.

+
+
+
+
+
+ +
+
+Note +
+
+
+

When all content parts in a message are strings, they are concatenated before being passed to the chat template. This means content parts work with any Jinja template — the template sees a plain string, and the per-part training flags are applied during tokenization.

+
+
+
+
Per-part training on reasoning_content
+

For templates that support a separate reasoning_content field (e.g., qwen3), the same content-parts format works on reasoning_content. This is useful for masking incorrect reasoning steps while training on self-corrections:

+
+
+
data.jsonl
+
+
{
+  "messages": [
+    {"role": "user", "content": [{"type": "text", "text": "What is 2+2?"}]},
+    {
+      "role": "assistant",
+      "reasoning_content": [
+        {"type": "text", "text": "Hmm maybe 2+2=5.", "train": false},
+        {"type": "text", "text": " Wait no, 2+2=4.", "train": true}
+      ],
+      "content": [
+        {"type": "text", "text": "The answer is 4.", "train": true}
+      ]
+    }
+  ]
+}
+
+

The reasoning_content and content fields are handled independently — each has its own token boundaries and per-part masking. No additional configuration is needed beyond what the template already requires.

+
+
+
+ +
+
+Tip +
+
+
+

When reasoning_content is provided as a separate field, split_thinking is not needed — the reasoning is already separated from the content in the data.

+
+
+

The same whitespace rules apply to reasoning_content parts as to content parts — split before spaces, keep newlines with the preceding part.

+
+

Reasoning split

(For Qwen3 template only) Enable reasoning split, where the reasoning is split from the content and passed as a separate field into the template.

-
datasets:
-  - path: ...
-    type: chat_template
-    chat_template: qwen3
-    split_thinking: true
+
datasets:
+  - path: ...
+    type: chat_template
+    chat_template: qwen3
+    split_thinking: true

For example, a content can look like:

-
{
-  "content": "<think>Some thinking outputs</think>Output after thinking."
-}
+
{
+  "content": "<think>Some thinking outputs</think>Output after thinking."
+}

After split, it will look like:

-
{
-  "reasoning_content": "Some thinking outputs",
-  "content": "Output after thinking..."
-}
+
{
+  "reasoning_content": "Some thinking outputs",
+  "content": "Output after thinking..."
+}
@@ -1207,7 +1337,7 @@ Important
data.jsonl
-
{"conversations": [{"role": "...", "value": "..."}]}
+
{"conversations": [{"role": "...", "value": "..."}]}
diff --git a/search.json b/search.json index fd2043004..f8babb061 100644 --- a/search.json +++ b/search.json @@ -1080,7 +1080,7 @@ "href": "docs/dataset-formats/conversation.html", "title": "Conversation", "section": "", - "text": "Chat Template strategy uses a jinja2 template that converts a list of messages into a prompt. Support using tokenizer’s template, a supported template, or custom jinja2.\n\n\ndata.jsonl\n\n{\"messages\": [{\"role\": \"...\", \"content\": \"...\"}, {\"role\": \"...\", \"content\": \"...\"}, ...]}\n\nSee configs for full configs and supported templates.\n\n\nMost configs can be adapted as follows:\n# old\nchat_template: chatml\ndatasets:\n - path: ...\n type: sharegpt\n conversation: chatml\n\n# new (if using tokenizer's chat_template)\ndatasets:\n - path: ...\n type: chat_template\n\n field_messages: conversations\n message_property_mappings:\n role: from\n content: value\n\n# new (if setting a new chat_template like chatml, gemma, etc)\nchat_template: chatml\ndatasets:\n - path: ...\n type: chat_template\n\n field_messages: conversations\n message_property_mappings:\n role: from\n content: value\nWe recommend checking the below examples for other usecases.\n\n\n\n\n\n(Legacy) Using the default chat template in the tokenizer_config.json on OpenAI messages format, training on only last message.\ndatasets:\n - path: ...\n type: chat_template\n roles_to_train:\n train_on_eos:\n\n\n\n\n\n\nTip\n\n\n\nIf you receive an error like “chat_template choice is tokenizer_default but tokenizer’s chat_template is null.”, it means the tokenizer does not have a default chat_template. Follow the examples below instead to set a custom chat_template.\n\n\n\n\n\nUsing the gemma chat template to override the tokenizer_config.json’s chat template on OpenAI messages format, training on all assistant messages.\nchat_template: gemma # this overwrites the tokenizer's chat_template\ndatasets:\n - path: ...\n type: chat_template\n roles_to_train: [\"assistant\"] # default value\n\n\n\n\n\n\nNote\n\n\n\nIf you want to use built-in chat_template, use chat_template: tokenizer_default (this is set by default).\n\n\n\n\n\nUsing the tokenizer_config.json’s chat template or chatml as fallback if the former’s chat template does not exist, on OpenAI messages format, training on all assistant messages.\nchat_template: tokenizer_default_fallback_chatml # this overwrites the tokenizer's chat_template\ndatasets:\n - path: ...\n type: chat_template\n\n\n\nUsing a custom jinja template on OpenAI messages format, training on all assistant messages.\n# chat_template: jinja # `jinja` will be implied if the `chat_template_jinja` is set and this field is empty\nchat_template_jinja: \"{{ bos_token }}{% for message in messages %}{% if (message['role'] == 'system') %}{{'<|system|>' + '\\n' + message['content'] + '<|end|>' + '\\n'}}{% elif (message['role'] == 'user') %}{{'<|user|>' + '\\n' + message['content'] + '<|end|>' + '\\n' + '<|assistant|>' + '\\n'}}{% elif message['role'] == 'assistant' %}{{message['content'] + '<|end|>' + '\\n'}}{% endif %}{% endfor %}\"\n\ndatasets:\n - path: ...\n type: chat_template\n\n\n\n\n\n\nImportant\n\n\n\nPlease make sure that your tokenizer.eos_token is same as EOS (End-of-Sequence) token in template. Otherwise, set eos_token under special_tokens:.\n\n\n\n\n\n\nIf you are using a template that has a different EOT (End-of-Turn) token from EOS token or multiple EOT tokens (like Mistral V7 Tekken), set the eot_tokens: config. The handling of EOT tokens follows train_on_eos: which defaults to turn.\n\neot_tokens:\n - \"[/INST]\"\n # - \"[/SYSTEM_PROMPT]\"\n\ndatasets:\n - path: ...\n type: chat_template\n\n # optional\n train_on_eot: turn # defaults read from train_on_eos (which defaults to turn)\n\n\n\n\n\n\nTip\n\n\n\nSee config documentation for detailed explanations of “turn”, “last”, and “all” options for training on tokens.\n\n\n\n\n\n\n\n\nNote\n\n\n\nUsing eot_tokens requires each token that exists in chat_template to be a single token in the tokenizer. Otherwise, the tokenizer will split the token and cause unexpected behavior.\nYou can add those tokens as new tokens under tokens: or (recommended) override unused added_tokens via added_tokens_overrides:. See config for more details.\n\n\n\nContinuing from the previous example, if you want to train on all EOT token trainable turns but only last EOS token, set train_on_eos: last.\n\neot_tokens:\n - \"[/INST]\"\n # ...\n\ndatasets:\n - path: ...\n type: chat_template\n\n train_on_eos: last\n train_on_eot: turn\n\n\n\n\n\n\nTip\n\n\n\nIf EOS token only appears at the end of a prompt, train_on_eos: last is equivalent to train_on_eos: turn. Therefore, generally, you can leave them to their defaults and omit them.\n\n\n\n\n\nInstead of passing tools via the system prompt, an alternative method would be to have the tools in a separate column and loaded via chat_template to let the template dynamically build it.\n{\n \"tools\": [\n {\n \"type\": \"...\",\n \"function\": {\n \"name\": \"...\",\n \"description\": \"...\",\n \"parameters\": {\n \"type\": \"...\",\n \"properties\": {\n // ...\n },\n \"required\": [\"...\"],\n },\n },\n },\n ],\n \"messages\": [\n // ...\n {\n \"role\": \"assistant\", // call the function via assistant\n \"tool_calls\": [\n {\n \"id\": \"...\", // required only for mistral\n \"type\": \"function\",\n \"function\": {\n \"name\": \"...\",\n \"arguments\": {\n \"...\": \"...\",\n }\n }\n }\n ]\n },\n {\n \"role\": \"tool\",\n \"tool_call_id\": \"...\", // required only for mistral\n \"name\": \"...\",\n \"content\": \"...\"\n },\n ],\n}\n\n\n\n\n\n\nNote\n\n\n\nTools need to follow JSON schema.\n\n\n\n\n\n\n\n\nWarning\n\n\n\nIf you have tool arguments with same name but different dtypes (like \"time\": string and \"time\": number), please save arguments: as JSON string to prevent datasets from having casting issues.\n\"arguments\": \"{\\\"...\\\": \\\"...\\\"}\"\nThe same is applicable for tool parameters.\n\"parameters\": \"{\\\"...\\\": \\\"...\\\"}\"\n\n\nExample config for Llama4:\nchat_template: llama4\ndatasets:\n - path: Nanobit/text-tools-2k-test\n type: chat_template\n # field_tools: tools # default is `tools`\n\n\n\n\n\n\nTip\n\n\n\nLook into the chat_template you are using to see if it supports tools and what the expected role is for the tool answer. In the example above, the tool answer is expected to be in the tool or ipython role for llama4 template.\n\n\n\n\n\n(Advanced) Using fine-grained control over tokens and turns to train in a conversation\nFor a data sample that looks like:\n\n\ndata.jsonl\n\n{\n \"conversations\": [\n {\"from\": \"system\", \"value\": \"You are an AI assistant.\", \"train\": false},\n {\"from\": \"human\", \"value\": \"Hello\", \"train\": false},\n {\"from\": \"assistant\", \"value\": \"Hello\", \"train\": true},\n {\"from\": \"human\", \"value\": \"How are you?\", \"train\": true},\n {\n \"from\": \"assistant\",\n \"value\": \"I'm doing very well, thank you!\",\n \"train_detail\": [\n {\"begin_offset\": 0, \"end_offset\": 8, \"train\": false},\n {\"begin_offset\": 9, \"end_offset\": 18, \"train\": true},\n {\"begin_offset\": 19, \"end_offset\": 30, \"train\": false},\n ],\n },\n {\n \"from\": \"human\",\n \"value\": \"I'm doing very well, thank you!\",\n \"train\": true,\n },\n {\"from\": \"assistant\", \"value\": \"Hi there!\", \"train\": true}\n ]\n}\n\nThe configuration would look like:\ndatasets:\n - path: ...\n type: chat_template\n chat_template: tokenizer_default\n field_messages: conversations\n message_property_mappings:\n role: from\n content: value\n roles_to_train: []\n train_on_eos: turn\n message_field_training: train\n message_field_training_detail: train_detail\n\n\n\n\n\n\nTip\n\n\n\nIt is not necessary to set both message_field_training and message_field_training_detail at once.\n\n\n\n\n\n(For Qwen3 template only) Enable reasoning split, where the reasoning is split from the content and passed as a separate field into the template.\ndatasets:\n - path: ...\n type: chat_template\n chat_template: qwen3\n split_thinking: true\nFor example, a content can look like:\n{\n \"content\": \"<think>Some thinking outputs</think>Output after thinking.\"\n}\nAfter split, it will look like:\n{\n \"reasoning_content\": \"Some thinking outputs\",\n \"content\": \"Output after thinking...\"\n}", + "text": "Chat Template strategy uses a jinja2 template that converts a list of messages into a prompt. Support using tokenizer’s template, a supported template, or custom jinja2.\n\n\ndata.jsonl\n\n{\"messages\": [{\"role\": \"...\", \"content\": \"...\"}, {\"role\": \"...\", \"content\": \"...\"}, ...]}\n\nSee configs for full configs and supported templates.\n\n\nMost configs can be adapted as follows:\n# old\nchat_template: chatml\ndatasets:\n - path: ...\n type: sharegpt\n conversation: chatml\n\n# new (if using tokenizer's chat_template)\ndatasets:\n - path: ...\n type: chat_template\n\n field_messages: conversations\n message_property_mappings:\n role: from\n content: value\n\n# new (if setting a new chat_template like chatml, gemma, etc)\nchat_template: chatml\ndatasets:\n - path: ...\n type: chat_template\n\n field_messages: conversations\n message_property_mappings:\n role: from\n content: value\nWe recommend checking the below examples for other usecases.\n\n\n\n\n\n(Legacy) Using the default chat template in the tokenizer_config.json on OpenAI messages format, training on only last message.\ndatasets:\n - path: ...\n type: chat_template\n roles_to_train:\n train_on_eos:\n\n\n\n\n\n\nTip\n\n\n\nIf you receive an error like “chat_template choice is tokenizer_default but tokenizer’s chat_template is null.”, it means the tokenizer does not have a default chat_template. Follow the examples below instead to set a custom chat_template.\n\n\n\n\n\nUsing the gemma chat template to override the tokenizer_config.json’s chat template on OpenAI messages format, training on all assistant messages.\nchat_template: gemma # this overwrites the tokenizer's chat_template\ndatasets:\n - path: ...\n type: chat_template\n roles_to_train: [\"assistant\"] # default value\n\n\n\n\n\n\nNote\n\n\n\nIf you want to use built-in chat_template, use chat_template: tokenizer_default (this is set by default).\n\n\n\n\n\nUsing the tokenizer_config.json’s chat template or chatml as fallback if the former’s chat template does not exist, on OpenAI messages format, training on all assistant messages.\nchat_template: tokenizer_default_fallback_chatml # this overwrites the tokenizer's chat_template\ndatasets:\n - path: ...\n type: chat_template\n\n\n\nUsing a custom jinja template on OpenAI messages format, training on all assistant messages.\n# chat_template: jinja # `jinja` will be implied if the `chat_template_jinja` is set and this field is empty\nchat_template_jinja: \"{{ bos_token }}{% for message in messages %}{% if (message['role'] == 'system') %}{{'<|system|>' + '\\n' + message['content'] + '<|end|>' + '\\n'}}{% elif (message['role'] == 'user') %}{{'<|user|>' + '\\n' + message['content'] + '<|end|>' + '\\n' + '<|assistant|>' + '\\n'}}{% elif message['role'] == 'assistant' %}{{message['content'] + '<|end|>' + '\\n'}}{% endif %}{% endfor %}\"\n\ndatasets:\n - path: ...\n type: chat_template\n\n\n\n\n\n\nTip\n\n\n\nchat_template_jinja also accepts a file path to a .jinja2 file instead of an inline string:\nchat_template_jinja: ./path/to/my_template.jinja2\n\n\n\n\n\n\n\n\nImportant\n\n\n\nPlease make sure that your tokenizer.eos_token is same as EOS (End-of-Sequence) token in template. Otherwise, set eos_token under special_tokens:.\n\n\n\n\n\n\nIf you are using a template that has a different EOT (End-of-Turn) token from EOS token or multiple EOT tokens (like Mistral V7 Tekken), set the eot_tokens: config. The handling of EOT tokens follows train_on_eos: which defaults to turn.\n\neot_tokens:\n - \"[/INST]\"\n # - \"[/SYSTEM_PROMPT]\"\n\ndatasets:\n - path: ...\n type: chat_template\n\n # optional\n train_on_eot: turn # defaults read from train_on_eos (which defaults to turn)\n\n\n\n\n\n\nTip\n\n\n\nSee config documentation for detailed explanations of “turn”, “last”, and “all” options for training on tokens.\n\n\n\n\n\n\n\n\nNote\n\n\n\nUsing eot_tokens requires each token that exists in chat_template to be a single token in the tokenizer. Otherwise, the tokenizer will split the token and cause unexpected behavior.\nYou can add those tokens as new tokens under tokens: or (recommended) override unused added_tokens via added_tokens_overrides:. See config for more details.\n\n\n\nContinuing from the previous example, if you want to train on all EOT token trainable turns but only last EOS token, set train_on_eos: last.\n\neot_tokens:\n - \"[/INST]\"\n # ...\n\ndatasets:\n - path: ...\n type: chat_template\n\n train_on_eos: last\n train_on_eot: turn\n\n\n\n\n\n\nTip\n\n\n\nIf EOS token only appears at the end of a prompt, train_on_eos: last is equivalent to train_on_eos: turn. Therefore, generally, you can leave them to their defaults and omit them.\n\n\n\n\n\nInstead of passing tools via the system prompt, an alternative method would be to have the tools in a separate column and loaded via chat_template to let the template dynamically build it.\n{\n \"tools\": [\n {\n \"type\": \"...\",\n \"function\": {\n \"name\": \"...\",\n \"description\": \"...\",\n \"parameters\": {\n \"type\": \"...\",\n \"properties\": {\n // ...\n },\n \"required\": [\"...\"],\n },\n },\n },\n ],\n \"messages\": [\n // ...\n {\n \"role\": \"assistant\", // call the function via assistant\n \"tool_calls\": [\n {\n \"id\": \"...\", // required only for mistral\n \"type\": \"function\",\n \"function\": {\n \"name\": \"...\",\n \"arguments\": {\n \"...\": \"...\",\n }\n }\n }\n ]\n },\n {\n \"role\": \"tool\",\n \"tool_call_id\": \"...\", // required only for mistral\n \"name\": \"...\",\n \"content\": \"...\"\n },\n ],\n}\n\n\n\n\n\n\nNote\n\n\n\nTools need to follow JSON schema.\n\n\n\n\n\n\n\n\nWarning\n\n\n\nIf you have tool arguments with same name but different dtypes (like \"time\": string and \"time\": number), please save arguments: as JSON string to prevent datasets from having casting issues.\n\"arguments\": \"{\\\"...\\\": \\\"...\\\"}\"\nThe same is applicable for tool parameters.\n\"parameters\": \"{\\\"...\\\": \\\"...\\\"}\"\n\n\nExample config for Llama4:\nchat_template: llama4\ndatasets:\n - path: Nanobit/text-tools-2k-test\n type: chat_template\n # field_tools: tools # default is `tools`\n\n\n\n\n\n\nTip\n\n\n\nLook into the chat_template you are using to see if it supports tools and what the expected role is for the tool answer. In the example above, the tool answer is expected to be in the tool or ipython role for llama4 template.\n\n\n\n\n\n(Advanced) Using fine-grained control over tokens and turns to train in a conversation\nFor a data sample that looks like:\n\n\ndata.jsonl\n\n{\n \"conversations\": [\n {\"from\": \"system\", \"value\": \"You are an AI assistant.\", \"train\": false},\n {\"from\": \"human\", \"value\": \"Hello\", \"train\": false},\n {\"from\": \"assistant\", \"value\": \"Hello\", \"train\": true},\n {\"from\": \"human\", \"value\": \"How are you?\", \"train\": true},\n {\n \"from\": \"assistant\",\n \"value\": \"I'm doing very well, thank you!\",\n \"train_detail\": [\n {\"begin_offset\": 0, \"end_offset\": 8, \"train\": false},\n {\"begin_offset\": 9, \"end_offset\": 18, \"train\": true},\n {\"begin_offset\": 19, \"end_offset\": 30, \"train\": false},\n ],\n },\n {\n \"from\": \"human\",\n \"value\": \"I'm doing very well, thank you!\",\n \"train\": true,\n },\n {\"from\": \"assistant\", \"value\": \"Hi there!\", \"train\": true}\n ]\n}\n\nThe configuration would look like:\ndatasets:\n - path: ...\n type: chat_template\n chat_template: tokenizer_default\n field_messages: conversations\n message_property_mappings:\n role: from\n content: value\n roles_to_train: []\n train_on_eos: turn\n message_field_training: train\n message_field_training_detail: train_detail\n\n\n\n\n\n\nTip\n\n\n\nIt is not necessary to set both message_field_training and message_field_training_detail at once.\n\n\n\n\n\nInstead of using character offsets with train_detail, you can split a message’s content into a list of parts, each with its own training flag. This is useful when you want to mask specific sections of a response (e.g., mask reasoning but train on the answer).\n\n\ndata.jsonl\n\n{\n \"messages\": [\n {\"role\": \"user\", \"content\": [{\"type\": \"text\", \"text\": \"What is 2+2?\"}]},\n {\n \"role\": \"assistant\",\n \"content\": [\n {\"type\": \"text\", \"text\": \"Let me think step by step...\", \"train\": false},\n {\"type\": \"text\", \"text\": \" The answer is 4.\", \"train\": true}\n ]\n }\n ]\n}\n\nThe configuration is the same as standard chat_template — no extra fields needed:\ndatasets:\n - path: ...\n type: chat_template\n roles_to_train: [\"assistant\"]\nEach content part supports:\n\ntype: \"text\" (required)\ntext: the text value (also accepts content or value as the key)\ntrain: true/false (optional) — whether to train on this part\nweight: 0/1 (optional) — alternative to train\n\nIf a part has no train or weight flag, it inherits the turn-level training decision (from roles_to_train, message_field_training, or train_on_inputs).\n\n\n\n\n\n\nWarningWhitespace at part boundaries\n\n\n\nBPE tokenizers (used by Llama, Qwen, Mistral, GPT, etc.) prepend spaces to word tokens. For example, \" answer\" is a single token — the space is part of it. This means where you place whitespace between content parts matters:\nSplit BEFORE spaces (space goes with the next part):\n[\n {\"type\": \"text\", \"text\": \"Let me think...\", \"train\": false},\n {\"type\": \"text\", \"text\": \" The answer is 4.\", \"train\": true}\n]\nDON’T put trailing spaces on a part (the space merges with the next word into one token that straddles the boundary, and straddling tokens are masked):\n[\n {\"type\": \"text\", \"text\": \"Let me think... \", \"train\": false},\n {\"type\": \"text\", \"text\": \"The answer is 4.\", \"train\": true}\n]\nIn the bad example, \" The\" becomes a single token that spans both parts. Because it straddles the boundary, it is conservatively masked (not trained) — even though the second part has train: true.\nNewlines typically merge with preceding punctuation (e.g., \":\\n\" is one token). Keep newlines with the preceding part:\n[\n {\"type\": \"text\", \"text\": \"Thinking:\\n\", \"train\": false},\n {\"type\": \"text\", \"text\": \"The answer is 4.\", \"train\": true}\n]\nAxolotl will log a warning if it detects trailing whitespace at a boundary between parts with different training flags.\n\n\n\n\n\n\n\n\nNote\n\n\n\nWhen all content parts in a message are strings, they are concatenated before being passed to the chat template. This means content parts work with any Jinja template — the template sees a plain string, and the per-part training flags are applied during tokenization.\n\n\n\n\nFor templates that support a separate reasoning_content field (e.g., qwen3), the same content-parts format works on reasoning_content. This is useful for masking incorrect reasoning steps while training on self-corrections:\n\n\ndata.jsonl\n\n{\n \"messages\": [\n {\"role\": \"user\", \"content\": [{\"type\": \"text\", \"text\": \"What is 2+2?\"}]},\n {\n \"role\": \"assistant\",\n \"reasoning_content\": [\n {\"type\": \"text\", \"text\": \"Hmm maybe 2+2=5.\", \"train\": false},\n {\"type\": \"text\", \"text\": \" Wait no, 2+2=4.\", \"train\": true}\n ],\n \"content\": [\n {\"type\": \"text\", \"text\": \"The answer is 4.\", \"train\": true}\n ]\n }\n ]\n}\n\nThe reasoning_content and content fields are handled independently — each has its own token boundaries and per-part masking. No additional configuration is needed beyond what the template already requires.\n\n\n\n\n\n\nTip\n\n\n\nWhen reasoning_content is provided as a separate field, split_thinking is not needed — the reasoning is already separated from the content in the data.\n\n\nThe same whitespace rules apply to reasoning_content parts as to content parts — split before spaces, keep newlines with the preceding part.\n\n\n\n\n(For Qwen3 template only) Enable reasoning split, where the reasoning is split from the content and passed as a separate field into the template.\ndatasets:\n - path: ...\n type: chat_template\n chat_template: qwen3\n split_thinking: true\nFor example, a content can look like:\n{\n \"content\": \"<think>Some thinking outputs</think>Output after thinking.\"\n}\nAfter split, it will look like:\n{\n \"reasoning_content\": \"Some thinking outputs\",\n \"content\": \"Output after thinking...\"\n}", "crumbs": [ "Dataset Formats", "Conversation" @@ -1091,7 +1091,7 @@ "href": "docs/dataset-formats/conversation.html#chat_template", "title": "Conversation", "section": "", - "text": "Chat Template strategy uses a jinja2 template that converts a list of messages into a prompt. Support using tokenizer’s template, a supported template, or custom jinja2.\n\n\ndata.jsonl\n\n{\"messages\": [{\"role\": \"...\", \"content\": \"...\"}, {\"role\": \"...\", \"content\": \"...\"}, ...]}\n\nSee configs for full configs and supported templates.\n\n\nMost configs can be adapted as follows:\n# old\nchat_template: chatml\ndatasets:\n - path: ...\n type: sharegpt\n conversation: chatml\n\n# new (if using tokenizer's chat_template)\ndatasets:\n - path: ...\n type: chat_template\n\n field_messages: conversations\n message_property_mappings:\n role: from\n content: value\n\n# new (if setting a new chat_template like chatml, gemma, etc)\nchat_template: chatml\ndatasets:\n - path: ...\n type: chat_template\n\n field_messages: conversations\n message_property_mappings:\n role: from\n content: value\nWe recommend checking the below examples for other usecases.\n\n\n\n\n\n(Legacy) Using the default chat template in the tokenizer_config.json on OpenAI messages format, training on only last message.\ndatasets:\n - path: ...\n type: chat_template\n roles_to_train:\n train_on_eos:\n\n\n\n\n\n\nTip\n\n\n\nIf you receive an error like “chat_template choice is tokenizer_default but tokenizer’s chat_template is null.”, it means the tokenizer does not have a default chat_template. Follow the examples below instead to set a custom chat_template.\n\n\n\n\n\nUsing the gemma chat template to override the tokenizer_config.json’s chat template on OpenAI messages format, training on all assistant messages.\nchat_template: gemma # this overwrites the tokenizer's chat_template\ndatasets:\n - path: ...\n type: chat_template\n roles_to_train: [\"assistant\"] # default value\n\n\n\n\n\n\nNote\n\n\n\nIf you want to use built-in chat_template, use chat_template: tokenizer_default (this is set by default).\n\n\n\n\n\nUsing the tokenizer_config.json’s chat template or chatml as fallback if the former’s chat template does not exist, on OpenAI messages format, training on all assistant messages.\nchat_template: tokenizer_default_fallback_chatml # this overwrites the tokenizer's chat_template\ndatasets:\n - path: ...\n type: chat_template\n\n\n\nUsing a custom jinja template on OpenAI messages format, training on all assistant messages.\n# chat_template: jinja # `jinja` will be implied if the `chat_template_jinja` is set and this field is empty\nchat_template_jinja: \"{{ bos_token }}{% for message in messages %}{% if (message['role'] == 'system') %}{{'<|system|>' + '\\n' + message['content'] + '<|end|>' + '\\n'}}{% elif (message['role'] == 'user') %}{{'<|user|>' + '\\n' + message['content'] + '<|end|>' + '\\n' + '<|assistant|>' + '\\n'}}{% elif message['role'] == 'assistant' %}{{message['content'] + '<|end|>' + '\\n'}}{% endif %}{% endfor %}\"\n\ndatasets:\n - path: ...\n type: chat_template\n\n\n\n\n\n\nImportant\n\n\n\nPlease make sure that your tokenizer.eos_token is same as EOS (End-of-Sequence) token in template. Otherwise, set eos_token under special_tokens:.\n\n\n\n\n\n\nIf you are using a template that has a different EOT (End-of-Turn) token from EOS token or multiple EOT tokens (like Mistral V7 Tekken), set the eot_tokens: config. The handling of EOT tokens follows train_on_eos: which defaults to turn.\n\neot_tokens:\n - \"[/INST]\"\n # - \"[/SYSTEM_PROMPT]\"\n\ndatasets:\n - path: ...\n type: chat_template\n\n # optional\n train_on_eot: turn # defaults read from train_on_eos (which defaults to turn)\n\n\n\n\n\n\nTip\n\n\n\nSee config documentation for detailed explanations of “turn”, “last”, and “all” options for training on tokens.\n\n\n\n\n\n\n\n\nNote\n\n\n\nUsing eot_tokens requires each token that exists in chat_template to be a single token in the tokenizer. Otherwise, the tokenizer will split the token and cause unexpected behavior.\nYou can add those tokens as new tokens under tokens: or (recommended) override unused added_tokens via added_tokens_overrides:. See config for more details.\n\n\n\nContinuing from the previous example, if you want to train on all EOT token trainable turns but only last EOS token, set train_on_eos: last.\n\neot_tokens:\n - \"[/INST]\"\n # ...\n\ndatasets:\n - path: ...\n type: chat_template\n\n train_on_eos: last\n train_on_eot: turn\n\n\n\n\n\n\nTip\n\n\n\nIf EOS token only appears at the end of a prompt, train_on_eos: last is equivalent to train_on_eos: turn. Therefore, generally, you can leave them to their defaults and omit them.\n\n\n\n\n\nInstead of passing tools via the system prompt, an alternative method would be to have the tools in a separate column and loaded via chat_template to let the template dynamically build it.\n{\n \"tools\": [\n {\n \"type\": \"...\",\n \"function\": {\n \"name\": \"...\",\n \"description\": \"...\",\n \"parameters\": {\n \"type\": \"...\",\n \"properties\": {\n // ...\n },\n \"required\": [\"...\"],\n },\n },\n },\n ],\n \"messages\": [\n // ...\n {\n \"role\": \"assistant\", // call the function via assistant\n \"tool_calls\": [\n {\n \"id\": \"...\", // required only for mistral\n \"type\": \"function\",\n \"function\": {\n \"name\": \"...\",\n \"arguments\": {\n \"...\": \"...\",\n }\n }\n }\n ]\n },\n {\n \"role\": \"tool\",\n \"tool_call_id\": \"...\", // required only for mistral\n \"name\": \"...\",\n \"content\": \"...\"\n },\n ],\n}\n\n\n\n\n\n\nNote\n\n\n\nTools need to follow JSON schema.\n\n\n\n\n\n\n\n\nWarning\n\n\n\nIf you have tool arguments with same name but different dtypes (like \"time\": string and \"time\": number), please save arguments: as JSON string to prevent datasets from having casting issues.\n\"arguments\": \"{\\\"...\\\": \\\"...\\\"}\"\nThe same is applicable for tool parameters.\n\"parameters\": \"{\\\"...\\\": \\\"...\\\"}\"\n\n\nExample config for Llama4:\nchat_template: llama4\ndatasets:\n - path: Nanobit/text-tools-2k-test\n type: chat_template\n # field_tools: tools # default is `tools`\n\n\n\n\n\n\nTip\n\n\n\nLook into the chat_template you are using to see if it supports tools and what the expected role is for the tool answer. In the example above, the tool answer is expected to be in the tool or ipython role for llama4 template.\n\n\n\n\n\n(Advanced) Using fine-grained control over tokens and turns to train in a conversation\nFor a data sample that looks like:\n\n\ndata.jsonl\n\n{\n \"conversations\": [\n {\"from\": \"system\", \"value\": \"You are an AI assistant.\", \"train\": false},\n {\"from\": \"human\", \"value\": \"Hello\", \"train\": false},\n {\"from\": \"assistant\", \"value\": \"Hello\", \"train\": true},\n {\"from\": \"human\", \"value\": \"How are you?\", \"train\": true},\n {\n \"from\": \"assistant\",\n \"value\": \"I'm doing very well, thank you!\",\n \"train_detail\": [\n {\"begin_offset\": 0, \"end_offset\": 8, \"train\": false},\n {\"begin_offset\": 9, \"end_offset\": 18, \"train\": true},\n {\"begin_offset\": 19, \"end_offset\": 30, \"train\": false},\n ],\n },\n {\n \"from\": \"human\",\n \"value\": \"I'm doing very well, thank you!\",\n \"train\": true,\n },\n {\"from\": \"assistant\", \"value\": \"Hi there!\", \"train\": true}\n ]\n}\n\nThe configuration would look like:\ndatasets:\n - path: ...\n type: chat_template\n chat_template: tokenizer_default\n field_messages: conversations\n message_property_mappings:\n role: from\n content: value\n roles_to_train: []\n train_on_eos: turn\n message_field_training: train\n message_field_training_detail: train_detail\n\n\n\n\n\n\nTip\n\n\n\nIt is not necessary to set both message_field_training and message_field_training_detail at once.\n\n\n\n\n\n(For Qwen3 template only) Enable reasoning split, where the reasoning is split from the content and passed as a separate field into the template.\ndatasets:\n - path: ...\n type: chat_template\n chat_template: qwen3\n split_thinking: true\nFor example, a content can look like:\n{\n \"content\": \"<think>Some thinking outputs</think>Output after thinking.\"\n}\nAfter split, it will look like:\n{\n \"reasoning_content\": \"Some thinking outputs\",\n \"content\": \"Output after thinking...\"\n}", + "text": "Chat Template strategy uses a jinja2 template that converts a list of messages into a prompt. Support using tokenizer’s template, a supported template, or custom jinja2.\n\n\ndata.jsonl\n\n{\"messages\": [{\"role\": \"...\", \"content\": \"...\"}, {\"role\": \"...\", \"content\": \"...\"}, ...]}\n\nSee configs for full configs and supported templates.\n\n\nMost configs can be adapted as follows:\n# old\nchat_template: chatml\ndatasets:\n - path: ...\n type: sharegpt\n conversation: chatml\n\n# new (if using tokenizer's chat_template)\ndatasets:\n - path: ...\n type: chat_template\n\n field_messages: conversations\n message_property_mappings:\n role: from\n content: value\n\n# new (if setting a new chat_template like chatml, gemma, etc)\nchat_template: chatml\ndatasets:\n - path: ...\n type: chat_template\n\n field_messages: conversations\n message_property_mappings:\n role: from\n content: value\nWe recommend checking the below examples for other usecases.\n\n\n\n\n\n(Legacy) Using the default chat template in the tokenizer_config.json on OpenAI messages format, training on only last message.\ndatasets:\n - path: ...\n type: chat_template\n roles_to_train:\n train_on_eos:\n\n\n\n\n\n\nTip\n\n\n\nIf you receive an error like “chat_template choice is tokenizer_default but tokenizer’s chat_template is null.”, it means the tokenizer does not have a default chat_template. Follow the examples below instead to set a custom chat_template.\n\n\n\n\n\nUsing the gemma chat template to override the tokenizer_config.json’s chat template on OpenAI messages format, training on all assistant messages.\nchat_template: gemma # this overwrites the tokenizer's chat_template\ndatasets:\n - path: ...\n type: chat_template\n roles_to_train: [\"assistant\"] # default value\n\n\n\n\n\n\nNote\n\n\n\nIf you want to use built-in chat_template, use chat_template: tokenizer_default (this is set by default).\n\n\n\n\n\nUsing the tokenizer_config.json’s chat template or chatml as fallback if the former’s chat template does not exist, on OpenAI messages format, training on all assistant messages.\nchat_template: tokenizer_default_fallback_chatml # this overwrites the tokenizer's chat_template\ndatasets:\n - path: ...\n type: chat_template\n\n\n\nUsing a custom jinja template on OpenAI messages format, training on all assistant messages.\n# chat_template: jinja # `jinja` will be implied if the `chat_template_jinja` is set and this field is empty\nchat_template_jinja: \"{{ bos_token }}{% for message in messages %}{% if (message['role'] == 'system') %}{{'<|system|>' + '\\n' + message['content'] + '<|end|>' + '\\n'}}{% elif (message['role'] == 'user') %}{{'<|user|>' + '\\n' + message['content'] + '<|end|>' + '\\n' + '<|assistant|>' + '\\n'}}{% elif message['role'] == 'assistant' %}{{message['content'] + '<|end|>' + '\\n'}}{% endif %}{% endfor %}\"\n\ndatasets:\n - path: ...\n type: chat_template\n\n\n\n\n\n\nTip\n\n\n\nchat_template_jinja also accepts a file path to a .jinja2 file instead of an inline string:\nchat_template_jinja: ./path/to/my_template.jinja2\n\n\n\n\n\n\n\n\nImportant\n\n\n\nPlease make sure that your tokenizer.eos_token is same as EOS (End-of-Sequence) token in template. Otherwise, set eos_token under special_tokens:.\n\n\n\n\n\n\nIf you are using a template that has a different EOT (End-of-Turn) token from EOS token or multiple EOT tokens (like Mistral V7 Tekken), set the eot_tokens: config. The handling of EOT tokens follows train_on_eos: which defaults to turn.\n\neot_tokens:\n - \"[/INST]\"\n # - \"[/SYSTEM_PROMPT]\"\n\ndatasets:\n - path: ...\n type: chat_template\n\n # optional\n train_on_eot: turn # defaults read from train_on_eos (which defaults to turn)\n\n\n\n\n\n\nTip\n\n\n\nSee config documentation for detailed explanations of “turn”, “last”, and “all” options for training on tokens.\n\n\n\n\n\n\n\n\nNote\n\n\n\nUsing eot_tokens requires each token that exists in chat_template to be a single token in the tokenizer. Otherwise, the tokenizer will split the token and cause unexpected behavior.\nYou can add those tokens as new tokens under tokens: or (recommended) override unused added_tokens via added_tokens_overrides:. See config for more details.\n\n\n\nContinuing from the previous example, if you want to train on all EOT token trainable turns but only last EOS token, set train_on_eos: last.\n\neot_tokens:\n - \"[/INST]\"\n # ...\n\ndatasets:\n - path: ...\n type: chat_template\n\n train_on_eos: last\n train_on_eot: turn\n\n\n\n\n\n\nTip\n\n\n\nIf EOS token only appears at the end of a prompt, train_on_eos: last is equivalent to train_on_eos: turn. Therefore, generally, you can leave them to their defaults and omit them.\n\n\n\n\n\nInstead of passing tools via the system prompt, an alternative method would be to have the tools in a separate column and loaded via chat_template to let the template dynamically build it.\n{\n \"tools\": [\n {\n \"type\": \"...\",\n \"function\": {\n \"name\": \"...\",\n \"description\": \"...\",\n \"parameters\": {\n \"type\": \"...\",\n \"properties\": {\n // ...\n },\n \"required\": [\"...\"],\n },\n },\n },\n ],\n \"messages\": [\n // ...\n {\n \"role\": \"assistant\", // call the function via assistant\n \"tool_calls\": [\n {\n \"id\": \"...\", // required only for mistral\n \"type\": \"function\",\n \"function\": {\n \"name\": \"...\",\n \"arguments\": {\n \"...\": \"...\",\n }\n }\n }\n ]\n },\n {\n \"role\": \"tool\",\n \"tool_call_id\": \"...\", // required only for mistral\n \"name\": \"...\",\n \"content\": \"...\"\n },\n ],\n}\n\n\n\n\n\n\nNote\n\n\n\nTools need to follow JSON schema.\n\n\n\n\n\n\n\n\nWarning\n\n\n\nIf you have tool arguments with same name but different dtypes (like \"time\": string and \"time\": number), please save arguments: as JSON string to prevent datasets from having casting issues.\n\"arguments\": \"{\\\"...\\\": \\\"...\\\"}\"\nThe same is applicable for tool parameters.\n\"parameters\": \"{\\\"...\\\": \\\"...\\\"}\"\n\n\nExample config for Llama4:\nchat_template: llama4\ndatasets:\n - path: Nanobit/text-tools-2k-test\n type: chat_template\n # field_tools: tools # default is `tools`\n\n\n\n\n\n\nTip\n\n\n\nLook into the chat_template you are using to see if it supports tools and what the expected role is for the tool answer. In the example above, the tool answer is expected to be in the tool or ipython role for llama4 template.\n\n\n\n\n\n(Advanced) Using fine-grained control over tokens and turns to train in a conversation\nFor a data sample that looks like:\n\n\ndata.jsonl\n\n{\n \"conversations\": [\n {\"from\": \"system\", \"value\": \"You are an AI assistant.\", \"train\": false},\n {\"from\": \"human\", \"value\": \"Hello\", \"train\": false},\n {\"from\": \"assistant\", \"value\": \"Hello\", \"train\": true},\n {\"from\": \"human\", \"value\": \"How are you?\", \"train\": true},\n {\n \"from\": \"assistant\",\n \"value\": \"I'm doing very well, thank you!\",\n \"train_detail\": [\n {\"begin_offset\": 0, \"end_offset\": 8, \"train\": false},\n {\"begin_offset\": 9, \"end_offset\": 18, \"train\": true},\n {\"begin_offset\": 19, \"end_offset\": 30, \"train\": false},\n ],\n },\n {\n \"from\": \"human\",\n \"value\": \"I'm doing very well, thank you!\",\n \"train\": true,\n },\n {\"from\": \"assistant\", \"value\": \"Hi there!\", \"train\": true}\n ]\n}\n\nThe configuration would look like:\ndatasets:\n - path: ...\n type: chat_template\n chat_template: tokenizer_default\n field_messages: conversations\n message_property_mappings:\n role: from\n content: value\n roles_to_train: []\n train_on_eos: turn\n message_field_training: train\n message_field_training_detail: train_detail\n\n\n\n\n\n\nTip\n\n\n\nIt is not necessary to set both message_field_training and message_field_training_detail at once.\n\n\n\n\n\nInstead of using character offsets with train_detail, you can split a message’s content into a list of parts, each with its own training flag. This is useful when you want to mask specific sections of a response (e.g., mask reasoning but train on the answer).\n\n\ndata.jsonl\n\n{\n \"messages\": [\n {\"role\": \"user\", \"content\": [{\"type\": \"text\", \"text\": \"What is 2+2?\"}]},\n {\n \"role\": \"assistant\",\n \"content\": [\n {\"type\": \"text\", \"text\": \"Let me think step by step...\", \"train\": false},\n {\"type\": \"text\", \"text\": \" The answer is 4.\", \"train\": true}\n ]\n }\n ]\n}\n\nThe configuration is the same as standard chat_template — no extra fields needed:\ndatasets:\n - path: ...\n type: chat_template\n roles_to_train: [\"assistant\"]\nEach content part supports:\n\ntype: \"text\" (required)\ntext: the text value (also accepts content or value as the key)\ntrain: true/false (optional) — whether to train on this part\nweight: 0/1 (optional) — alternative to train\n\nIf a part has no train or weight flag, it inherits the turn-level training decision (from roles_to_train, message_field_training, or train_on_inputs).\n\n\n\n\n\n\nWarningWhitespace at part boundaries\n\n\n\nBPE tokenizers (used by Llama, Qwen, Mistral, GPT, etc.) prepend spaces to word tokens. For example, \" answer\" is a single token — the space is part of it. This means where you place whitespace between content parts matters:\nSplit BEFORE spaces (space goes with the next part):\n[\n {\"type\": \"text\", \"text\": \"Let me think...\", \"train\": false},\n {\"type\": \"text\", \"text\": \" The answer is 4.\", \"train\": true}\n]\nDON’T put trailing spaces on a part (the space merges with the next word into one token that straddles the boundary, and straddling tokens are masked):\n[\n {\"type\": \"text\", \"text\": \"Let me think... \", \"train\": false},\n {\"type\": \"text\", \"text\": \"The answer is 4.\", \"train\": true}\n]\nIn the bad example, \" The\" becomes a single token that spans both parts. Because it straddles the boundary, it is conservatively masked (not trained) — even though the second part has train: true.\nNewlines typically merge with preceding punctuation (e.g., \":\\n\" is one token). Keep newlines with the preceding part:\n[\n {\"type\": \"text\", \"text\": \"Thinking:\\n\", \"train\": false},\n {\"type\": \"text\", \"text\": \"The answer is 4.\", \"train\": true}\n]\nAxolotl will log a warning if it detects trailing whitespace at a boundary between parts with different training flags.\n\n\n\n\n\n\n\n\nNote\n\n\n\nWhen all content parts in a message are strings, they are concatenated before being passed to the chat template. This means content parts work with any Jinja template — the template sees a plain string, and the per-part training flags are applied during tokenization.\n\n\n\n\nFor templates that support a separate reasoning_content field (e.g., qwen3), the same content-parts format works on reasoning_content. This is useful for masking incorrect reasoning steps while training on self-corrections:\n\n\ndata.jsonl\n\n{\n \"messages\": [\n {\"role\": \"user\", \"content\": [{\"type\": \"text\", \"text\": \"What is 2+2?\"}]},\n {\n \"role\": \"assistant\",\n \"reasoning_content\": [\n {\"type\": \"text\", \"text\": \"Hmm maybe 2+2=5.\", \"train\": false},\n {\"type\": \"text\", \"text\": \" Wait no, 2+2=4.\", \"train\": true}\n ],\n \"content\": [\n {\"type\": \"text\", \"text\": \"The answer is 4.\", \"train\": true}\n ]\n }\n ]\n}\n\nThe reasoning_content and content fields are handled independently — each has its own token boundaries and per-part masking. No additional configuration is needed beyond what the template already requires.\n\n\n\n\n\n\nTip\n\n\n\nWhen reasoning_content is provided as a separate field, split_thinking is not needed — the reasoning is already separated from the content in the data.\n\n\nThe same whitespace rules apply to reasoning_content parts as to content parts — split before spaces, keep newlines with the preceding part.\n\n\n\n\n(For Qwen3 template only) Enable reasoning split, where the reasoning is split from the content and passed as a separate field into the template.\ndatasets:\n - path: ...\n type: chat_template\n chat_template: qwen3\n split_thinking: true\nFor example, a content can look like:\n{\n \"content\": \"<think>Some thinking outputs</think>Output after thinking.\"\n}\nAfter split, it will look like:\n{\n \"reasoning_content\": \"Some thinking outputs\",\n \"content\": \"Output after thinking...\"\n}", "crumbs": [ "Dataset Formats", "Conversation" @@ -4710,14 +4710,14 @@ "href": "docs/api/prompt_strategies.chat_template.html", "title": "prompt_strategies.chat_template", "section": "", - "text": "prompt_strategies.chat_template\nHF Chat Templates prompt strategy\n\n\n\n\n\nName\nDescription\n\n\n\n\nChatTemplatePrompter\nPrompter for HF chat templates\n\n\nChatTemplateStrategy\nTokenizing strategy for instruction-based prompts.\n\n\nMistralPrompter\nMistral prompter for chat template.\n\n\nMistralStrategy\nMistral strategy for chat template.\n\n\nStrategyLoader\nLoad chat template strategy based on configuration.\n\n\n\n\n\nprompt_strategies.chat_template.ChatTemplatePrompter(\n tokenizer,\n chat_template,\n processor=None,\n max_length=2048,\n message_property_mappings=None,\n message_field_training=None,\n message_field_training_detail=None,\n field_messages='messages',\n field_system='system',\n field_tools='tools',\n field_thinking='reasoning_content',\n roles=None,\n template_thinking_key='reasoning_content',\n chat_template_kwargs=None,\n drop_system_message=False,\n)\nPrompter for HF chat templates\n\n\n\n\n\nName\nDescription\n\n\n\n\nbuild_prompt\nBuild a prompt from a conversation.\n\n\n\n\n\nprompt_strategies.chat_template.ChatTemplatePrompter.build_prompt(\n conversation,\n add_generation_prompt=False,\n images=None,\n tools=None,\n real_last_index=None,\n)\nBuild a prompt from a conversation.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nconversation\nlist[dict]\nA list of messages.\nrequired\n\n\nadd_generation_prompt\n\nWhether to add a generation prompt.\nFalse\n\n\nimages\n\nA list of images. (optional)\nNone\n\n\ntools\n\nA list of tools. (optional)\nNone\n\n\n\n\n\n\n\n\n\nprompt_strategies.chat_template.ChatTemplateStrategy(\n prompter,\n tokenizer,\n train_on_inputs,\n sequence_len,\n roles_to_train=None,\n train_on_eos=None,\n train_on_eot=None,\n eot_tokens=None,\n split_thinking=False,\n)\nTokenizing strategy for instruction-based prompts.\n\n\n\n\n\nName\nDescription\n\n\n\n\nfind_first_eot_token\nFind the first EOT token in the input_ids starting from start_idx.\n\n\nfind_turn\nLocate the starting and ending indices of the specified turn in a conversation.\n\n\ntokenize_prompt\nPublic method that can handle either a single prompt or a batch of prompts.\n\n\n\n\n\nprompt_strategies.chat_template.ChatTemplateStrategy.find_first_eot_token(\n input_ids,\n start_idx,\n)\nFind the first EOT token in the input_ids starting from start_idx.\n\n\n\nprompt_strategies.chat_template.ChatTemplateStrategy.find_turn(\n turns,\n turn_idx,\n tools=None,\n)\nLocate the starting and ending indices of the specified turn in a conversation.\n\n\n\nprompt_strategies.chat_template.ChatTemplateStrategy.tokenize_prompt(prompt)\nPublic method that can handle either a single prompt or a batch of prompts.\n\n\n\n\n\nprompt_strategies.chat_template.MistralPrompter(*args, **kwargs)\nMistral prompter for chat template.\n\n\n\nprompt_strategies.chat_template.MistralStrategy(\n prompter,\n tokenizer,\n train_on_inputs,\n sequence_len,\n roles_to_train=None,\n train_on_eos=None,\n train_on_eot=None,\n eot_tokens=None,\n split_thinking=False,\n)\nMistral strategy for chat template.\n\n\n\n\n\nName\nDescription\n\n\n\n\nfind_first_eot_token\nFind the first EOT token in the input_ids starting from start_idx.\n\n\n\n\n\nprompt_strategies.chat_template.MistralStrategy.find_first_eot_token(\n input_ids,\n start_idx,\n)\nFind the first EOT token in the input_ids starting from start_idx.\n\n\n\n\n\nprompt_strategies.chat_template.StrategyLoader()\nLoad chat template strategy based on configuration." + "text": "prompt_strategies.chat_template\nHF Chat Templates prompt strategy\n\n\n\n\n\nName\nDescription\n\n\n\n\nChatTemplatePrompter\nPrompter for HF chat templates\n\n\nChatTemplateStrategy\nTokenizing strategy for instruction-based prompts.\n\n\nMistralPrompter\nMistral prompter for chat template.\n\n\nMistralStrategy\nMistral strategy for chat template.\n\n\nStrategyLoader\nLoad chat template strategy based on configuration.\n\n\n\n\n\nprompt_strategies.chat_template.ChatTemplatePrompter(\n tokenizer,\n chat_template,\n processor=None,\n max_length=2048,\n message_property_mappings=None,\n message_field_training=None,\n message_field_training_detail=None,\n field_messages='messages',\n field_system='system',\n field_tools='tools',\n field_thinking='reasoning_content',\n roles=None,\n template_thinking_key='reasoning_content',\n chat_template_kwargs=None,\n drop_system_message=False,\n)\nPrompter for HF chat templates\n\n\n\n\n\nName\nDescription\n\n\n\n\nbuild_prompt\nBuild a prompt from a conversation.\n\n\n\n\n\nprompt_strategies.chat_template.ChatTemplatePrompter.build_prompt(\n conversation,\n add_generation_prompt=False,\n images=None,\n tools=None,\n real_last_index=None,\n)\nBuild a prompt from a conversation.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nconversation\nlist[dict]\nA list of messages.\nrequired\n\n\nadd_generation_prompt\n\nWhether to add a generation prompt.\nFalse\n\n\nimages\n\nA list of images. (optional)\nNone\n\n\ntools\n\nA list of tools. (optional)\nNone\n\n\n\n\n\n\n\n\n\nprompt_strategies.chat_template.ChatTemplateStrategy(\n prompter,\n tokenizer,\n train_on_inputs,\n sequence_len,\n roles_to_train=None,\n train_on_eos=None,\n train_on_eot=None,\n eot_tokens=None,\n split_thinking=False,\n)\nTokenizing strategy for instruction-based prompts.\n\n\n\n\n\nName\nDescription\n\n\n\n\nfind_first_eot_token\nFind the first EOT token in the input_ids starting from start_idx.\n\n\nfind_turn\nLocate the starting and ending indices of the specified turn in a conversation.\n\n\ntokenize_prompt\nPublic method that can handle either a single prompt or a batch of prompts.\n\n\n\n\n\nprompt_strategies.chat_template.ChatTemplateStrategy.find_first_eot_token(\n input_ids,\n start_idx,\n)\nFind the first EOT token in the input_ids starting from start_idx.\n\n\n\nprompt_strategies.chat_template.ChatTemplateStrategy.find_turn(\n turns,\n turn_idx,\n tools=None,\n content_only=False,\n reasoning_only=False,\n)\nLocate the starting and ending indices of the specified turn in a conversation.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\ncontent_only\nbool\nIf True and the turn has reasoning_content (template_thinking_key), preserve reasoning_content in the dummy turn so the diff only captures the content field boundaries. This is needed for correct training_detail alignment when reasoning_content is present.\nFalse\n\n\nreasoning_only\nbool\nIf True, preserve content in the dummy turn and replace reasoning_content with a dummy, so the diff only captures the reasoning_content field boundaries.\nFalse\n\n\n\n\n\n\n\nprompt_strategies.chat_template.ChatTemplateStrategy.tokenize_prompt(prompt)\nPublic method that can handle either a single prompt or a batch of prompts.\n\n\n\n\n\nprompt_strategies.chat_template.MistralPrompter(*args, **kwargs)\nMistral prompter for chat template.\n\n\n\nprompt_strategies.chat_template.MistralStrategy(\n prompter,\n tokenizer,\n train_on_inputs,\n sequence_len,\n roles_to_train=None,\n train_on_eos=None,\n train_on_eot=None,\n eot_tokens=None,\n split_thinking=False,\n)\nMistral strategy for chat template.\n\n\n\n\n\nName\nDescription\n\n\n\n\nfind_first_eot_token\nFind the first EOT token in the input_ids starting from start_idx.\n\n\n\n\n\nprompt_strategies.chat_template.MistralStrategy.find_first_eot_token(\n input_ids,\n start_idx,\n)\nFind the first EOT token in the input_ids starting from start_idx.\n\n\n\n\n\nprompt_strategies.chat_template.StrategyLoader()\nLoad chat template strategy based on configuration." }, { "objectID": "docs/api/prompt_strategies.chat_template.html#classes", "href": "docs/api/prompt_strategies.chat_template.html#classes", "title": "prompt_strategies.chat_template", "section": "", - "text": "Name\nDescription\n\n\n\n\nChatTemplatePrompter\nPrompter for HF chat templates\n\n\nChatTemplateStrategy\nTokenizing strategy for instruction-based prompts.\n\n\nMistralPrompter\nMistral prompter for chat template.\n\n\nMistralStrategy\nMistral strategy for chat template.\n\n\nStrategyLoader\nLoad chat template strategy based on configuration.\n\n\n\n\n\nprompt_strategies.chat_template.ChatTemplatePrompter(\n tokenizer,\n chat_template,\n processor=None,\n max_length=2048,\n message_property_mappings=None,\n message_field_training=None,\n message_field_training_detail=None,\n field_messages='messages',\n field_system='system',\n field_tools='tools',\n field_thinking='reasoning_content',\n roles=None,\n template_thinking_key='reasoning_content',\n chat_template_kwargs=None,\n drop_system_message=False,\n)\nPrompter for HF chat templates\n\n\n\n\n\nName\nDescription\n\n\n\n\nbuild_prompt\nBuild a prompt from a conversation.\n\n\n\n\n\nprompt_strategies.chat_template.ChatTemplatePrompter.build_prompt(\n conversation,\n add_generation_prompt=False,\n images=None,\n tools=None,\n real_last_index=None,\n)\nBuild a prompt from a conversation.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nconversation\nlist[dict]\nA list of messages.\nrequired\n\n\nadd_generation_prompt\n\nWhether to add a generation prompt.\nFalse\n\n\nimages\n\nA list of images. (optional)\nNone\n\n\ntools\n\nA list of tools. (optional)\nNone\n\n\n\n\n\n\n\n\n\nprompt_strategies.chat_template.ChatTemplateStrategy(\n prompter,\n tokenizer,\n train_on_inputs,\n sequence_len,\n roles_to_train=None,\n train_on_eos=None,\n train_on_eot=None,\n eot_tokens=None,\n split_thinking=False,\n)\nTokenizing strategy for instruction-based prompts.\n\n\n\n\n\nName\nDescription\n\n\n\n\nfind_first_eot_token\nFind the first EOT token in the input_ids starting from start_idx.\n\n\nfind_turn\nLocate the starting and ending indices of the specified turn in a conversation.\n\n\ntokenize_prompt\nPublic method that can handle either a single prompt or a batch of prompts.\n\n\n\n\n\nprompt_strategies.chat_template.ChatTemplateStrategy.find_first_eot_token(\n input_ids,\n start_idx,\n)\nFind the first EOT token in the input_ids starting from start_idx.\n\n\n\nprompt_strategies.chat_template.ChatTemplateStrategy.find_turn(\n turns,\n turn_idx,\n tools=None,\n)\nLocate the starting and ending indices of the specified turn in a conversation.\n\n\n\nprompt_strategies.chat_template.ChatTemplateStrategy.tokenize_prompt(prompt)\nPublic method that can handle either a single prompt or a batch of prompts.\n\n\n\n\n\nprompt_strategies.chat_template.MistralPrompter(*args, **kwargs)\nMistral prompter for chat template.\n\n\n\nprompt_strategies.chat_template.MistralStrategy(\n prompter,\n tokenizer,\n train_on_inputs,\n sequence_len,\n roles_to_train=None,\n train_on_eos=None,\n train_on_eot=None,\n eot_tokens=None,\n split_thinking=False,\n)\nMistral strategy for chat template.\n\n\n\n\n\nName\nDescription\n\n\n\n\nfind_first_eot_token\nFind the first EOT token in the input_ids starting from start_idx.\n\n\n\n\n\nprompt_strategies.chat_template.MistralStrategy.find_first_eot_token(\n input_ids,\n start_idx,\n)\nFind the first EOT token in the input_ids starting from start_idx.\n\n\n\n\n\nprompt_strategies.chat_template.StrategyLoader()\nLoad chat template strategy based on configuration." + "text": "Name\nDescription\n\n\n\n\nChatTemplatePrompter\nPrompter for HF chat templates\n\n\nChatTemplateStrategy\nTokenizing strategy for instruction-based prompts.\n\n\nMistralPrompter\nMistral prompter for chat template.\n\n\nMistralStrategy\nMistral strategy for chat template.\n\n\nStrategyLoader\nLoad chat template strategy based on configuration.\n\n\n\n\n\nprompt_strategies.chat_template.ChatTemplatePrompter(\n tokenizer,\n chat_template,\n processor=None,\n max_length=2048,\n message_property_mappings=None,\n message_field_training=None,\n message_field_training_detail=None,\n field_messages='messages',\n field_system='system',\n field_tools='tools',\n field_thinking='reasoning_content',\n roles=None,\n template_thinking_key='reasoning_content',\n chat_template_kwargs=None,\n drop_system_message=False,\n)\nPrompter for HF chat templates\n\n\n\n\n\nName\nDescription\n\n\n\n\nbuild_prompt\nBuild a prompt from a conversation.\n\n\n\n\n\nprompt_strategies.chat_template.ChatTemplatePrompter.build_prompt(\n conversation,\n add_generation_prompt=False,\n images=None,\n tools=None,\n real_last_index=None,\n)\nBuild a prompt from a conversation.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nconversation\nlist[dict]\nA list of messages.\nrequired\n\n\nadd_generation_prompt\n\nWhether to add a generation prompt.\nFalse\n\n\nimages\n\nA list of images. (optional)\nNone\n\n\ntools\n\nA list of tools. (optional)\nNone\n\n\n\n\n\n\n\n\n\nprompt_strategies.chat_template.ChatTemplateStrategy(\n prompter,\n tokenizer,\n train_on_inputs,\n sequence_len,\n roles_to_train=None,\n train_on_eos=None,\n train_on_eot=None,\n eot_tokens=None,\n split_thinking=False,\n)\nTokenizing strategy for instruction-based prompts.\n\n\n\n\n\nName\nDescription\n\n\n\n\nfind_first_eot_token\nFind the first EOT token in the input_ids starting from start_idx.\n\n\nfind_turn\nLocate the starting and ending indices of the specified turn in a conversation.\n\n\ntokenize_prompt\nPublic method that can handle either a single prompt or a batch of prompts.\n\n\n\n\n\nprompt_strategies.chat_template.ChatTemplateStrategy.find_first_eot_token(\n input_ids,\n start_idx,\n)\nFind the first EOT token in the input_ids starting from start_idx.\n\n\n\nprompt_strategies.chat_template.ChatTemplateStrategy.find_turn(\n turns,\n turn_idx,\n tools=None,\n content_only=False,\n reasoning_only=False,\n)\nLocate the starting and ending indices of the specified turn in a conversation.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\ncontent_only\nbool\nIf True and the turn has reasoning_content (template_thinking_key), preserve reasoning_content in the dummy turn so the diff only captures the content field boundaries. This is needed for correct training_detail alignment when reasoning_content is present.\nFalse\n\n\nreasoning_only\nbool\nIf True, preserve content in the dummy turn and replace reasoning_content with a dummy, so the diff only captures the reasoning_content field boundaries.\nFalse\n\n\n\n\n\n\n\nprompt_strategies.chat_template.ChatTemplateStrategy.tokenize_prompt(prompt)\nPublic method that can handle either a single prompt or a batch of prompts.\n\n\n\n\n\nprompt_strategies.chat_template.MistralPrompter(*args, **kwargs)\nMistral prompter for chat template.\n\n\n\nprompt_strategies.chat_template.MistralStrategy(\n prompter,\n tokenizer,\n train_on_inputs,\n sequence_len,\n roles_to_train=None,\n train_on_eos=None,\n train_on_eot=None,\n eot_tokens=None,\n split_thinking=False,\n)\nMistral strategy for chat template.\n\n\n\n\n\nName\nDescription\n\n\n\n\nfind_first_eot_token\nFind the first EOT token in the input_ids starting from start_idx.\n\n\n\n\n\nprompt_strategies.chat_template.MistralStrategy.find_first_eot_token(\n input_ids,\n start_idx,\n)\nFind the first EOT token in the input_ids starting from start_idx.\n\n\n\n\n\nprompt_strategies.chat_template.StrategyLoader()\nLoad chat template strategy based on configuration." }, { "objectID": "docs/api/kernels.utils.html", diff --git a/sitemap.xml b/sitemap.xml index 93283ffda..cc118d140 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,990 +2,990 @@ https://docs.axolotl.ai/FAQS.html - 2026-04-10T03:03:08.648Z + 2026-04-10T18:12:14.277Z https://docs.axolotl.ai/docs/qat.html - 2026-04-10T03:03:08.657Z + 2026-04-10T18:12:14.285Z https://docs.axolotl.ai/docs/models/seed-oss.html - 2026-04-10T03:07:07.976Z + 2026-04-10T18:16:18.521Z https://docs.axolotl.ai/docs/models/internvl3_5.html - 2026-04-10T03:07:07.968Z + 2026-04-10T18:16:18.513Z https://docs.axolotl.ai/docs/models/apertus.html - 2026-04-10T03:07:07.976Z + 2026-04-10T18:16:18.521Z https://docs.axolotl.ai/docs/models/mistral.html - 2026-04-10T03:07:07.974Z + 2026-04-10T18:16:18.519Z https://docs.axolotl.ai/docs/models/smolvlm2.html - 2026-04-10T03:07:07.977Z + 2026-04-10T18:16:18.522Z https://docs.axolotl.ai/docs/models/arcee.html - 2026-04-10T03:07:07.969Z + 2026-04-10T18:16:18.514Z https://docs.axolotl.ai/docs/models/ministral3/vision.html - 2026-04-10T03:07:07.970Z + 2026-04-10T18:16:18.515Z https://docs.axolotl.ai/docs/models/kimi-linear.html - 2026-04-10T03:07:07.967Z + 2026-04-10T18:16:18.512Z https://docs.axolotl.ai/docs/models/mimo.html - 2026-04-10T03:07:07.968Z + 2026-04-10T18:16:18.513Z https://docs.axolotl.ai/docs/models/phi.html - 2026-04-10T03:07:07.977Z + 2026-04-10T18:16:18.522Z https://docs.axolotl.ai/docs/models/qwen3.html - 2026-04-10T03:07:07.975Z + 2026-04-10T18:16:18.520Z https://docs.axolotl.ai/docs/models/hunyuan.html - 2026-04-10T03:07:07.978Z + 2026-04-10T18:16:18.523Z https://docs.axolotl.ai/docs/models/ministral.html - 2026-04-10T03:07:07.972Z + 2026-04-10T18:16:18.517Z https://docs.axolotl.ai/docs/models/gemma3n.html - 2026-04-10T03:07:07.975Z + 2026-04-10T18:16:18.520Z https://docs.axolotl.ai/docs/models/devstral.html - 2026-04-10T03:07:07.973Z + 2026-04-10T18:16:18.518Z https://docs.axolotl.ai/docs/models/magistral/think.html - 2026-04-10T03:07:07.971Z + 2026-04-10T18:16:18.517Z https://docs.axolotl.ai/docs/models/qwen3-next.html - 2026-04-10T03:07:07.975Z + 2026-04-10T18:16:18.520Z https://docs.axolotl.ai/docs/training_stability.html - 2026-04-10T03:03:08.658Z + 2026-04-10T18:12:14.286Z https://docs.axolotl.ai/docs/expert_quantization.html - 2026-04-10T03:03:08.652Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/rlhf.html - 2026-04-10T03:03:08.657Z + 2026-04-10T18:12:14.285Z https://docs.axolotl.ai/docs/dataset-formats/conversation.html - 2026-04-10T03:03:08.651Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/dataset-formats/template_free.html - 2026-04-10T03:03:08.652Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/dataset-formats/tokenized.html - 2026-04-10T03:03:08.652Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/gradient_checkpointing.html - 2026-04-10T03:03:08.652Z + 2026-04-10T18:12:14.281Z https://docs.axolotl.ai/docs/checkpoint_saving.html - 2026-04-10T03:03:08.651Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/api/prompt_strategies.kto.llama3.html - 2026-04-10T03:06:42.770Z + 2026-04-10T18:15:54.033Z https://docs.axolotl.ai/docs/api/core.chat.format.chatml.html - 2026-04-10T03:06:42.087Z + 2026-04-10T18:15:53.349Z https://docs.axolotl.ai/docs/api/cli.quantize.html - 2026-04-10T03:06:42.300Z + 2026-04-10T18:15:53.560Z https://docs.axolotl.ai/docs/api/utils.lora.html - 2026-04-10T03:06:43.062Z + 2026-04-10T18:15:54.324Z https://docs.axolotl.ai/docs/api/loaders.model.html - 2026-04-10T03:06:42.473Z + 2026-04-10T18:15:53.732Z https://docs.axolotl.ai/docs/api/cli.merge_lora.html - 2026-04-10T03:06:42.269Z + 2026-04-10T18:15:53.530Z https://docs.axolotl.ai/docs/api/core.trainers.dpo.trainer.html - 2026-04-10T03:06:42.426Z + 2026-04-10T18:15:53.685Z https://docs.axolotl.ai/docs/api/monkeypatch.transformers_fa_utils.html - 2026-04-10T03:06:42.993Z + 2026-04-10T18:15:54.255Z https://docs.axolotl.ai/docs/api/prompt_strategies.completion.html - 2026-04-10T03:06:42.678Z + 2026-04-10T18:15:53.939Z https://docs.axolotl.ai/docs/api/convert.html - 2026-04-10T03:06:41.956Z + 2026-04-10T18:15:53.217Z https://docs.axolotl.ai/docs/api/utils.schemas.datasets.html - 2026-04-10T03:06:43.286Z + 2026-04-10T18:15:54.546Z https://docs.axolotl.ai/docs/api/core.chat.format.llama3x.html - 2026-04-10T03:06:42.089Z + 2026-04-10T18:15:53.351Z https://docs.axolotl.ai/docs/api/prompt_strategies.messages.chat.html - 2026-04-10T03:06:42.719Z + 2026-04-10T18:15:53.982Z https://docs.axolotl.ai/docs/api/core.trainers.grpo.sampler.html - 2026-04-10T03:06:42.459Z + 2026-04-10T18:15:53.718Z https://docs.axolotl.ai/docs/api/kernels.quantize.html - 2026-04-10T03:06:42.907Z + 2026-04-10T18:15:54.170Z https://docs.axolotl.ai/docs/api/integrations.liger.args.html - 2026-04-10T03:06:43.554Z + 2026-04-10T18:15:54.810Z https://docs.axolotl.ai/docs/api/cli.preprocess.html - 2026-04-10T03:06:42.294Z + 2026-04-10T18:15:53.554Z https://docs.axolotl.ai/docs/api/utils.callbacks.comet_.html - 2026-04-10T03:06:43.696Z + 2026-04-10T18:15:54.951Z https://docs.axolotl.ai/docs/api/utils.callbacks.profiler.html - 2026-04-10T03:06:43.686Z + 2026-04-10T18:15:54.940Z https://docs.axolotl.ai/docs/api/monkeypatch.utils.html - 2026-04-10T03:06:42.972Z + 2026-04-10T18:15:54.234Z https://docs.axolotl.ai/docs/api/prompt_strategies.orpo.chat_template.html - 2026-04-10T03:06:42.809Z + 2026-04-10T18:15:54.071Z https://docs.axolotl.ai/docs/api/utils.chat_templates.html - 2026-04-10T03:06:43.056Z + 2026-04-10T18:15:54.318Z https://docs.axolotl.ai/docs/api/prompt_strategies.dpo.chatml.html - 2026-04-10T03:06:42.754Z + 2026-04-10T18:15:54.017Z https://docs.axolotl.ai/docs/api/monkeypatch.gradient_checkpointing.offload_disk.html - 2026-04-10T03:06:43.046Z + 2026-04-10T18:15:54.308Z https://docs.axolotl.ai/docs/api/cli.checks.html - 2026-04-10T03:06:42.213Z + 2026-04-10T18:15:53.473Z https://docs.axolotl.ai/docs/api/utils.schemas.utils.html - 2026-04-10T03:06:43.348Z + 2026-04-10T18:15:54.606Z https://docs.axolotl.ai/docs/api/monkeypatch.lora_kernels.html - 2026-04-10T03:06:42.965Z + 2026-04-10T18:15:54.227Z https://docs.axolotl.ai/docs/api/utils.schemas.model.html - 2026-04-10T03:06:43.252Z + 2026-04-10T18:15:54.513Z https://docs.axolotl.ai/docs/api/prompt_strategies.pygmalion.html - 2026-04-10T03:06:42.714Z + 2026-04-10T18:15:53.975Z https://docs.axolotl.ai/docs/api/prompt_strategies.bradley_terry.llama3.html - 2026-04-10T03:06:42.814Z + 2026-04-10T18:15:54.076Z https://docs.axolotl.ai/docs/api/utils.optimizers.adopt.html - 2026-04-10T03:06:43.189Z + 2026-04-10T18:15:54.451Z https://docs.axolotl.ai/docs/api/utils.bench.html - 2026-04-10T03:06:43.074Z + 2026-04-10T18:15:54.336Z https://docs.axolotl.ai/docs/api/utils.callbacks.qat.html - 2026-04-10T03:06:43.706Z + 2026-04-10T18:15:54.960Z https://docs.axolotl.ai/docs/api/core.trainers.base.html - 2026-04-10T03:06:42.392Z + 2026-04-10T18:15:53.651Z https://docs.axolotl.ai/docs/api/prompt_strategies.dpo.zephyr.html - 2026-04-10T03:06:42.756Z + 2026-04-10T18:15:54.019Z https://docs.axolotl.ai/docs/api/core.chat.messages.html - 2026-04-10T03:06:42.085Z + 2026-04-10T18:15:53.347Z https://docs.axolotl.ai/docs/api/integrations.lm_eval.args.html - 2026-04-10T03:06:43.557Z + 2026-04-10T18:15:54.814Z https://docs.axolotl.ai/docs/api/core.trainers.mamba.html - 2026-04-10T03:06:42.417Z + 2026-04-10T18:15:53.676Z https://docs.axolotl.ai/docs/api/train.html - 2026-04-10T03:06:41.919Z + 2026-04-10T18:15:53.179Z https://docs.axolotl.ai/docs/api/prompt_strategies.orcamini.html - 2026-04-10T03:06:42.705Z + 2026-04-10T18:15:53.966Z https://docs.axolotl.ai/docs/api/cli.inference.html - 2026-04-10T03:06:42.259Z + 2026-04-10T18:15:53.519Z https://docs.axolotl.ai/docs/api/prompt_strategies.input_output.html - 2026-04-10T03:06:42.686Z + 2026-04-10T18:15:53.947Z https://docs.axolotl.ai/docs/api/utils.data.streaming.html - 2026-04-10T03:06:43.191Z + 2026-04-10T18:15:54.452Z https://docs.axolotl.ai/docs/api/cli.cloud.modal_.html - 2026-04-10T03:06:42.321Z + 2026-04-10T18:15:53.581Z https://docs.axolotl.ai/docs/api/utils.collators.mm_chat.html - 2026-04-10T03:06:43.622Z + 2026-04-10T18:15:54.877Z https://docs.axolotl.ai/docs/api/cli.config.html - 2026-04-10T03:06:42.235Z + 2026-04-10T18:15:53.495Z https://docs.axolotl.ai/docs/api/monkeypatch.multipack.html - 2026-04-10T03:06:42.922Z + 2026-04-10T18:15:54.184Z https://docs.axolotl.ai/docs/api/integrations.grokfast.optimizer.html - 2026-04-10T03:06:43.540Z + 2026-04-10T18:15:54.796Z https://docs.axolotl.ai/docs/api/core.trainers.trl.html - 2026-04-10T03:06:42.410Z + 2026-04-10T18:15:53.669Z https://docs.axolotl.ai/docs/api/prompt_strategies.alpaca_chat.html - 2026-04-10T03:06:42.627Z + 2026-04-10T18:15:53.889Z https://docs.axolotl.ai/docs/api/core.builders.rl.html - 2026-04-10T03:06:42.040Z + 2026-04-10T18:15:53.301Z https://docs.axolotl.ai/docs/api/utils.schemas.trl.html - 2026-04-10T03:06:43.301Z + 2026-04-10T18:15:54.561Z https://docs.axolotl.ai/docs/api/utils.collators.batching.html - 2026-04-10T03:06:43.611Z + 2026-04-10T18:15:54.867Z https://docs.axolotl.ai/docs/api/utils.model_shard_quant.html - 2026-04-10T03:06:43.070Z + 2026-04-10T18:15:54.331Z https://docs.axolotl.ai/docs/api/integrations.kd.trainer.html - 2026-04-10T03:06:43.550Z + 2026-04-10T18:15:54.806Z https://docs.axolotl.ai/docs/api/utils.schemas.peft.html - 2026-04-10T03:06:43.297Z + 2026-04-10T18:15:54.557Z https://docs.axolotl.ai/docs/api/utils.ctx_managers.sequence_parallel.html - 2026-04-10T03:06:42.566Z + 2026-04-10T18:15:53.825Z https://docs.axolotl.ai/docs/api/cli.vllm_serve.html - 2026-04-10T03:06:42.309Z + 2026-04-10T18:15:53.569Z https://docs.axolotl.ai/docs/api/utils.quantization.html - 2026-04-10T03:06:43.224Z + 2026-04-10T18:15:54.484Z https://docs.axolotl.ai/docs/api/utils.collators.mamba.html - 2026-04-10T03:06:43.616Z + 2026-04-10T18:15:54.871Z https://docs.axolotl.ai/docs/api/kernels.geglu.html - 2026-04-10T03:06:42.880Z + 2026-04-10T18:15:54.142Z https://docs.axolotl.ai/docs/api/core.trainers.utils.html - 2026-04-10T03:06:42.461Z + 2026-04-10T18:15:53.720Z https://docs.axolotl.ai/docs/api/monkeypatch.llama_attn_hijack_flash.html - 2026-04-10T03:06:42.916Z + 2026-04-10T18:15:54.179Z https://docs.axolotl.ai/docs/api/common.architectures.html - 2026-04-10T03:06:43.564Z + 2026-04-10T18:15:54.820Z https://docs.axolotl.ai/docs/api/cli.merge_sharded_fsdp_weights.html - 2026-04-10T03:06:42.283Z + 2026-04-10T18:15:53.544Z https://docs.axolotl.ai/docs/api/prompt_strategies.llama2_chat.html - 2026-04-10T03:06:42.671Z + 2026-04-10T18:15:53.932Z https://docs.axolotl.ai/docs/api/loaders.adapter.html - 2026-04-10T03:06:42.493Z + 2026-04-10T18:15:53.752Z https://docs.axolotl.ai/docs/api/cli.utils.fetch.html - 2026-04-10T03:06:42.344Z + 2026-04-10T18:15:53.604Z https://docs.axolotl.ai/docs/api/monkeypatch.stablelm_attn_hijack_flash.html - 2026-04-10T03:06:42.981Z + 2026-04-10T18:15:54.243Z https://docs.axolotl.ai/docs/api/cli.main.html - 2026-04-10T03:06:42.155Z + 2026-04-10T18:15:53.415Z https://docs.axolotl.ai/docs/api/utils.schedulers.html - 2026-04-10T03:06:43.147Z + 2026-04-10T18:15:54.409Z https://docs.axolotl.ai/docs/api/utils.samplers.multipack.html - 2026-04-10T03:06:43.674Z + 2026-04-10T18:15:54.928Z https://docs.axolotl.ai/docs/api/core.chat.format.shared.html - 2026-04-10T03:06:42.091Z + 2026-04-10T18:15:53.352Z https://docs.axolotl.ai/docs/api/utils.schemas.multimodal.html - 2026-04-10T03:06:43.308Z + 2026-04-10T18:15:54.568Z https://docs.axolotl.ai/docs/multimodal.html - 2026-04-10T03:03:08.656Z + 2026-04-10T18:12:14.285Z https://docs.axolotl.ai/docs/input_output.html - 2026-04-10T03:03:08.656Z + 2026-04-10T18:12:14.284Z https://docs.axolotl.ai/docs/multi-gpu.html - 2026-04-10T03:03:08.656Z + 2026-04-10T18:12:14.284Z https://docs.axolotl.ai/docs/lora_optims.html - 2026-04-10T03:03:08.656Z + 2026-04-10T18:12:14.284Z https://docs.axolotl.ai/docs/telemetry.html - 2026-04-10T03:03:08.658Z + 2026-04-10T18:12:14.286Z https://docs.axolotl.ai/docs/batch_vs_grad.html - 2026-04-10T03:03:08.651Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/custom_integrations.html - 2026-04-10T03:03:08.651Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/fsdp_qlora.html - 2026-04-10T03:03:08.652Z + 2026-04-10T18:12:14.281Z https://docs.axolotl.ai/docs/nccl.html - 2026-04-10T03:03:08.656Z + 2026-04-10T18:12:14.285Z https://docs.axolotl.ai/docs/vllm_serving.html - 2026-04-10T03:03:08.658Z + 2026-04-10T18:12:14.286Z https://docs.axolotl.ai/docs/attention.html - 2026-04-10T03:03:08.651Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/multipack.html - 2026-04-10T03:03:08.656Z + 2026-04-10T18:12:14.285Z https://docs.axolotl.ai/docs/torchao.html - 2026-04-10T03:03:08.658Z + 2026-04-10T18:12:14.286Z https://docs.axolotl.ai/docs/nd_parallelism.html - 2026-04-10T03:03:08.657Z + 2026-04-10T18:12:14.285Z https://docs.axolotl.ai/docs/mac.html - 2026-04-10T03:03:08.656Z + 2026-04-10T18:12:14.284Z https://docs.axolotl.ai/docs/reward_modelling.html - 2026-04-10T03:03:08.657Z + 2026-04-10T18:12:14.285Z https://docs.axolotl.ai/docs/agents/model_architectures.html - 2026-04-10T03:03:08.651Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/agents/grpo.html - 2026-04-10T03:03:08.651Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/agents/pretraining.html - 2026-04-10T03:03:08.651Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/agents/new_model_support.html - 2026-04-10T03:03:08.651Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/optimizers.html - 2026-04-10T03:03:08.657Z + 2026-04-10T18:12:14.285Z https://docs.axolotl.ai/examples/colab-notebooks/colab-axolotl-example.html - 2026-04-10T03:03:08.664Z + 2026-04-10T18:12:14.293Z https://docs.axolotl.ai/src/axolotl/integrations/LICENSE.html - 2026-04-10T03:03:08.695Z + 2026-04-10T18:12:14.328Z https://docs.axolotl.ai/src/axolotl/integrations/cut_cross_entropy/ACKNOWLEDGEMENTS.html - 2026-04-10T03:03:08.696Z + 2026-04-10T18:12:14.329Z https://docs.axolotl.ai/docs/installation.html - 2026-04-10T03:03:08.656Z + 2026-04-10T18:12:14.284Z https://docs.axolotl.ai/docs/ebft.html - 2026-04-10T03:03:08.652Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/agents/reward_modelling.html - 2026-04-10T03:03:08.651Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/agents/sft.html - 2026-04-10T03:03:08.651Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/agents/preference_tuning.html - 2026-04-10T03:03:08.651Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/mixed_precision.html - 2026-04-10T03:03:08.656Z + 2026-04-10T18:12:14.284Z https://docs.axolotl.ai/docs/docker.html - 2026-04-10T03:03:08.652Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/grpo.html - 2026-04-10T03:03:08.653Z + 2026-04-10T18:12:14.281Z https://docs.axolotl.ai/docs/streaming.html - 2026-04-10T03:03:08.658Z + 2026-04-10T18:12:14.286Z https://docs.axolotl.ai/docs/choosing_method.html - 2026-04-10T03:03:08.651Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/dataset_loading.html - 2026-04-10T03:03:08.652Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/sequence_parallelism.html - 2026-04-10T03:03:08.658Z + 2026-04-10T18:12:14.286Z https://docs.axolotl.ai/docs/optimizations.html - 2026-04-10T03:03:08.657Z + 2026-04-10T18:12:14.285Z https://docs.axolotl.ai/docs/multi-node.html - 2026-04-10T03:03:08.656Z + 2026-04-10T18:12:14.284Z https://docs.axolotl.ai/docs/lr_groups.html - 2026-04-10T03:03:08.656Z + 2026-04-10T18:12:14.284Z https://docs.axolotl.ai/docs/quantize.html - 2026-04-10T03:03:08.657Z + 2026-04-10T18:12:14.285Z https://docs.axolotl.ai/docs/inference.html - 2026-04-10T03:03:08.656Z + 2026-04-10T18:12:14.284Z https://docs.axolotl.ai/docs/ray-integration.html - 2026-04-10T03:03:08.657Z + 2026-04-10T18:12:14.285Z https://docs.axolotl.ai/docs/amd_hpc.html - 2026-04-10T03:03:08.651Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/unsloth.html - 2026-04-10T03:03:08.658Z + 2026-04-10T18:12:14.286Z https://docs.axolotl.ai/docs/getting-started.html - 2026-04-10T03:03:08.652Z + 2026-04-10T18:12:14.281Z https://docs.axolotl.ai/docs/api/utils.schemas.enums.html - 2026-04-10T03:06:43.339Z + 2026-04-10T18:15:54.599Z https://docs.axolotl.ai/docs/api/core.builders.base.html - 2026-04-10T03:06:42.029Z + 2026-04-10T18:15:53.290Z https://docs.axolotl.ai/docs/api/logging_config.html - 2026-04-10T03:06:42.021Z + 2026-04-10T18:15:53.282Z https://docs.axolotl.ai/docs/api/prompt_strategies.alpaca_instruct.html - 2026-04-10T03:06:42.629Z + 2026-04-10T18:15:53.891Z https://docs.axolotl.ai/docs/api/utils.callbacks.mlflow_.html - 2026-04-10T03:06:43.693Z + 2026-04-10T18:15:54.947Z https://docs.axolotl.ai/docs/api/cli.utils.html - 2026-04-10T03:06:42.323Z + 2026-04-10T18:15:53.583Z https://docs.axolotl.ai/docs/api/loaders.patch_manager.html - 2026-04-10T03:06:42.515Z + 2026-04-10T18:15:53.774Z https://docs.axolotl.ai/docs/api/core.datasets.chat.html - 2026-04-10T03:06:42.097Z + 2026-04-10T18:15:53.359Z https://docs.axolotl.ai/docs/api/core.trainers.mixins.scheduler.html - 2026-04-10T03:06:42.537Z + 2026-04-10T18:15:53.796Z https://docs.axolotl.ai/docs/api/common.datasets.html - 2026-04-10T03:06:43.585Z + 2026-04-10T18:15:54.841Z https://docs.axolotl.ai/docs/api/prompt_strategies.kto.chatml.html - 2026-04-10T03:06:42.781Z + 2026-04-10T18:15:54.043Z https://docs.axolotl.ai/docs/api/prompt_strategies.user_defined.html - 2026-04-10T03:06:42.655Z + 2026-04-10T18:15:53.916Z https://docs.axolotl.ai/docs/api/prompt_strategies.chat_template.html - 2026-04-10T03:06:42.610Z + 2026-04-10T18:15:53.871Z https://docs.axolotl.ai/docs/api/kernels.utils.html - 2026-04-10T03:06:42.908Z + 2026-04-10T18:15:54.171Z https://docs.axolotl.ai/docs/api/monkeypatch.mistral_attn_hijack_flash.html - 2026-04-10T03:06:42.920Z + 2026-04-10T18:15:54.182Z https://docs.axolotl.ai/docs/api/utils.schemas.config.html - 2026-04-10T03:06:43.243Z + 2026-04-10T18:15:54.504Z https://docs.axolotl.ai/docs/api/utils.dict.html - 2026-04-10T03:06:43.179Z + 2026-04-10T18:15:54.441Z https://docs.axolotl.ai/docs/api/loaders.constants.html - 2026-04-10T03:06:42.517Z + 2026-04-10T18:15:53.776Z https://docs.axolotl.ai/docs/api/monkeypatch.data.batch_dataset_fetcher.html - 2026-04-10T03:06:43.007Z + 2026-04-10T18:15:54.269Z https://docs.axolotl.ai/docs/api/kernels.lora.html - 2026-04-10T03:06:42.867Z + 2026-04-10T18:15:54.129Z https://docs.axolotl.ai/docs/api/datasets.html - 2026-04-10T03:06:41.939Z + 2026-04-10T18:15:53.200Z https://docs.axolotl.ai/docs/api/common.const.html - 2026-04-10T03:06:43.566Z + 2026-04-10T18:15:54.822Z https://docs.axolotl.ai/docs/api/core.trainers.grpo.trainer.html - 2026-04-10T03:06:42.444Z + 2026-04-10T18:15:53.703Z https://docs.axolotl.ai/docs/api/kernels.swiglu.html - 2026-04-10T03:06:42.892Z + 2026-04-10T18:15:54.155Z https://docs.axolotl.ai/docs/api/cli.utils.load.html - 2026-04-10T03:06:42.351Z + 2026-04-10T18:15:53.610Z https://docs.axolotl.ai/docs/api/prompt_strategies.dpo.passthrough.html - 2026-04-10T03:06:42.760Z + 2026-04-10T18:15:54.023Z https://docs.axolotl.ai/docs/api/cli.delinearize_llama4.html - 2026-04-10T03:06:42.241Z + 2026-04-10T18:15:53.502Z https://docs.axolotl.ai/docs/api/prompt_strategies.stepwise_supervised.html - 2026-04-10T03:06:42.692Z + 2026-04-10T18:15:53.953Z https://docs.axolotl.ai/docs/api/utils.freeze.html - 2026-04-10T03:06:43.086Z + 2026-04-10T18:15:54.348Z https://docs.axolotl.ai/docs/api/cli.train.html - 2026-04-10T03:06:42.165Z + 2026-04-10T18:15:53.426Z https://docs.axolotl.ai/docs/api/models.mamba.modeling_mamba.html - 2026-04-10T03:06:43.586Z + 2026-04-10T18:15:54.842Z https://docs.axolotl.ai/docs/api/prompt_strategies.alpaca_w_system.html - 2026-04-10T03:06:42.644Z + 2026-04-10T18:15:53.906Z https://docs.axolotl.ai/docs/api/prompt_strategies.kto.user_defined.html - 2026-04-10T03:06:42.783Z + 2026-04-10T18:15:54.045Z https://docs.axolotl.ai/docs/api/integrations.base.html - 2026-04-10T03:06:43.535Z + 2026-04-10T18:15:54.791Z https://docs.axolotl.ai/docs/api/utils.callbacks.perplexity.html - 2026-04-10T03:06:43.682Z + 2026-04-10T18:15:54.936Z https://docs.axolotl.ai/docs/api/loaders.tokenizer.html - 2026-04-10T03:06:42.484Z + 2026-04-10T18:15:53.743Z https://docs.axolotl.ai/docs/api/core.datasets.transforms.chat_builder.html - 2026-04-10T03:06:42.107Z + 2026-04-10T18:15:53.368Z https://docs.axolotl.ai/docs/api/prompt_strategies.dpo.chat_template.html - 2026-04-10T03:06:42.728Z + 2026-04-10T18:15:53.991Z https://docs.axolotl.ai/docs/api/loaders.processor.html - 2026-04-10T03:06:42.486Z + 2026-04-10T18:15:53.745Z https://docs.axolotl.ai/docs/api/utils.tokenization.html - 2026-04-10T03:06:43.054Z + 2026-04-10T18:15:54.316Z https://docs.axolotl.ai/docs/api/monkeypatch.trainer_fsdp_optim.html - 2026-04-10T03:06:42.985Z + 2026-04-10T18:15:54.247Z https://docs.axolotl.ai/docs/api/utils.data.sft.html - 2026-04-10T03:06:43.200Z + 2026-04-10T18:15:54.460Z https://docs.axolotl.ai/docs/api/prompt_strategies.dpo.user_defined.html - 2026-04-10T03:06:42.758Z + 2026-04-10T18:15:54.021Z https://docs.axolotl.ai/docs/api/integrations.spectrum.args.html - 2026-04-10T03:06:43.563Z + 2026-04-10T18:15:54.818Z https://docs.axolotl.ai/docs/api/integrations.cut_cross_entropy.args.html - 2026-04-10T03:06:43.539Z + 2026-04-10T18:15:54.795Z https://docs.axolotl.ai/docs/api/monkeypatch.mixtral.html - 2026-04-10T03:06:43.008Z + 2026-04-10T18:15:54.270Z https://docs.axolotl.ai/docs/api/prompt_strategies.dpo.llama3.html - 2026-04-10T03:06:42.741Z + 2026-04-10T18:15:54.004Z https://docs.axolotl.ai/docs/api/monkeypatch.gradient_checkpointing.offload_cpu.html - 2026-04-10T03:06:43.013Z + 2026-04-10T18:15:54.275Z https://docs.axolotl.ai/docs/api/monkeypatch.llama_attn_hijack_xformers.html - 2026-04-10T03:06:42.918Z + 2026-04-10T18:15:54.180Z https://docs.axolotl.ai/docs/api/utils.trainer.html - 2026-04-10T03:06:43.108Z + 2026-04-10T18:15:54.370Z https://docs.axolotl.ai/docs/api/monkeypatch.btlm_attn_hijack_flash.html - 2026-04-10T03:06:42.974Z + 2026-04-10T18:15:54.236Z https://docs.axolotl.ai/docs/api/core.builders.causal.html - 2026-04-10T03:06:42.035Z + 2026-04-10T18:15:53.296Z https://docs.axolotl.ai/docs/api/cli.cloud.base.html - 2026-04-10T03:06:42.313Z + 2026-04-10T18:15:53.573Z https://docs.axolotl.ai/docs/api/core.trainers.mixins.rng_state_loader.html - 2026-04-10T03:06:42.528Z + 2026-04-10T18:15:53.787Z https://docs.axolotl.ai/docs/api/index.html - 2026-04-10T03:06:41.840Z + 2026-04-10T18:15:53.102Z https://docs.axolotl.ai/docs/api/prompt_strategies.base.html - 2026-04-10T03:06:42.568Z + 2026-04-10T18:15:53.827Z https://docs.axolotl.ai/docs/api/monkeypatch.unsloth_.html - 2026-04-10T03:06:42.995Z + 2026-04-10T18:15:54.257Z https://docs.axolotl.ai/docs/api/utils.schemas.integrations.html - 2026-04-10T03:06:43.328Z + 2026-04-10T18:15:54.588Z https://docs.axolotl.ai/docs/api/core.training_args.html - 2026-04-10T03:06:42.055Z + 2026-04-10T18:15:53.317Z https://docs.axolotl.ai/docs/api/cli.utils.sweeps.html - 2026-04-10T03:06:42.358Z + 2026-04-10T18:15:53.618Z https://docs.axolotl.ai/docs/api/cli.art.html - 2026-04-10T03:06:42.205Z + 2026-04-10T18:15:53.465Z https://docs.axolotl.ai/docs/api/monkeypatch.relora.html - 2026-04-10T03:06:42.926Z + 2026-04-10T18:15:54.189Z https://docs.axolotl.ai/docs/api/prompt_tokenizers.html - 2026-04-10T03:06:42.009Z + 2026-04-10T18:15:53.270Z https://docs.axolotl.ai/docs/api/cli.args.html - 2026-04-10T03:06:42.201Z + 2026-04-10T18:15:53.461Z https://docs.axolotl.ai/docs/api/utils.collators.core.html - 2026-04-10T03:06:43.588Z + 2026-04-10T18:15:54.844Z https://docs.axolotl.ai/docs/api/utils.distributed.html - 2026-04-10T03:06:43.172Z + 2026-04-10T18:15:54.434Z https://docs.axolotl.ai/docs/api/cli.evaluate.html - 2026-04-10T03:06:42.176Z + 2026-04-10T18:15:53.436Z https://docs.axolotl.ai/docs/api/evaluate.html - 2026-04-10T03:06:41.932Z + 2026-04-10T18:15:53.192Z https://docs.axolotl.ai/docs/api/prompt_strategies.metharme.html - 2026-04-10T03:06:42.700Z + 2026-04-10T18:15:53.962Z https://docs.axolotl.ai/docs/api/utils.callbacks.lisa.html - 2026-04-10T03:06:43.688Z + 2026-04-10T18:15:54.942Z https://docs.axolotl.ai/docs/api/cli.utils.args.html - 2026-04-10T03:06:42.337Z + 2026-04-10T18:15:53.597Z https://docs.axolotl.ai/docs/api/utils.schemas.training.html - 2026-04-10T03:06:43.261Z + 2026-04-10T18:15:54.522Z https://docs.axolotl.ai/docs/api/core.trainers.mixins.optimizer.html - 2026-04-10T03:06:42.524Z + 2026-04-10T18:15:53.783Z https://docs.axolotl.ai/docs/api/cli.utils.train.html - 2026-04-10T03:06:42.372Z + 2026-04-10T18:15:53.633Z https://docs.axolotl.ai/docs/faq.html - 2026-04-10T03:03:08.652Z + 2026-04-10T18:12:14.281Z https://docs.axolotl.ai/docs/dataset_preprocessing.html - 2026-04-10T03:03:08.652Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/dataset-formats/inst_tune.html - 2026-04-10T03:03:08.652Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/dataset-formats/pretraining.html - 2026-04-10T03:03:08.652Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/dataset-formats/index.html - 2026-04-10T03:03:08.652Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/dataset-formats/stepwise_supervised.html - 2026-04-10T03:03:08.652Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/cli.html - 2026-04-10T03:03:08.651Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/config-reference.html - 2026-04-10T03:07:06.839Z + 2026-04-10T18:16:17.575Z https://docs.axolotl.ai/docs/debugging.html - 2026-04-10T03:03:08.652Z + 2026-04-10T18:12:14.280Z https://docs.axolotl.ai/docs/models/magistral/vision.html - 2026-04-10T03:07:07.972Z + 2026-04-10T18:16:18.517Z https://docs.axolotl.ai/docs/models/trinity.html - 2026-04-10T03:07:07.969Z + 2026-04-10T18:16:18.514Z https://docs.axolotl.ai/docs/models/gpt-oss.html - 2026-04-10T03:07:07.976Z + 2026-04-10T18:16:18.521Z https://docs.axolotl.ai/docs/models/LiquidAI.html - 2026-04-10T03:07:07.978Z + 2026-04-10T18:16:18.523Z https://docs.axolotl.ai/docs/models/granite4.html - 2026-04-10T03:07:07.977Z + 2026-04-10T18:16:18.522Z https://docs.axolotl.ai/docs/models/voxtral.html - 2026-04-10T03:07:07.973Z + 2026-04-10T18:16:18.518Z https://docs.axolotl.ai/docs/models/mistral-small.html - 2026-04-10T03:07:07.973Z + 2026-04-10T18:16:18.518Z https://docs.axolotl.ai/docs/models/llama-4.html - 2026-04-10T03:07:07.974Z + 2026-04-10T18:16:18.519Z https://docs.axolotl.ai/docs/models/llama-2.html - 2026-04-10T03:07:07.974Z + 2026-04-10T18:16:18.519Z https://docs.axolotl.ai/docs/models/jamba.html - 2026-04-10T03:07:07.979Z + 2026-04-10T18:16:18.523Z https://docs.axolotl.ai/docs/models/ministral3/think.html - 2026-04-10T03:07:07.970Z + 2026-04-10T18:16:18.515Z https://docs.axolotl.ai/docs/models/orpheus.html - 2026-04-10T03:07:07.979Z + 2026-04-10T18:16:18.524Z https://docs.axolotl.ai/docs/models/index.html - 2026-04-10T03:07:07.979Z + 2026-04-10T18:16:18.524Z https://docs.axolotl.ai/docs/models/olmo3.html - 2026-04-10T03:07:07.968Z + 2026-04-10T18:16:18.513Z https://docs.axolotl.ai/docs/models/magistral.html - 2026-04-10T03:07:07.971Z + 2026-04-10T18:16:18.516Z https://docs.axolotl.ai/docs/models/ministral3.html - 2026-04-10T03:07:07.970Z + 2026-04-10T18:16:18.515Z https://docs.axolotl.ai/docs/models/plano.html - 2026-04-10T03:07:07.967Z + 2026-04-10T18:16:18.512Z https://docs.axolotl.ai/index.html - 2026-04-10T03:03:08.687Z + 2026-04-10T18:12:14.317Z