Fine-tuning JSONL validator

Check a training file before the upload rather than after it: malformed lines, roles that no trainer accepts, examples with nothing for the model to learn from, duplicates, and how many tokens each example really costs. Your dataset stays in this tab.

  • ChecksStructure, roles, size, duplicates
  • Formatsmessages, prompt/completion
  • Your datasetNever leaves the tab
Examples
5
messages (chat)
Valid
3
2 with errors
Warnings
2
worth a look
Duplicates
1
same content
Tokens
≈ 138
one pass over the set
Per example
≈ 42
7 - 47

Your JSONL

One JSON object per line. Blank lines are ignored.

The cleaned file drops

2 of 5 lines would be kept, re-serialised one per line.

Nothing here was uploaded - the whole check ran in this tab.

Line by line

2 lines would fail the upload.

  • line 1messages (chat) · ≈ 42 tokens

    {"messages":[{"role":"system","content":"You answer support questions in the customer's language."},{"role":"user","cont

  • line 2messages (chat) · ≈ 47 tokens

    {"messages":[{"role":"system","content":"You answer support questions in the customer's language."},{"role":"user","cont

  • line 3messages (chat) · ≈ 42 tokens

    duplicate of line 1

  • line 4messages (chat) · ≈ 7 tokens

    no assistant message - the example has nothing to learn from

    message 2 repeats the "user" role - most trainers expect turns to alternate

    does not end on an assistant turn - the last turn is what gets learned

  • line 5unrecognised · ≈ 0 tokens

    invalid JSON: Unterminated string

Token counts are the same ±20% estimate the token calculator uses. For a training bill, multiply the total by your provider’s training rate and by the number of epochs.

What counts as an error

Anything that would stop the upload: a line that is not JSON, a line that is not an object, an empty messages array, a missing or unknown role, empty content, and an example with no assistant turn - which has nothing for the model to learn from.

What is only a warning

Things providers disagree about: tool and developer roles, two turns from the same role in a row, an example that does not end on an assistant turn, and very short examples. They train, but they usually mean the export went wrong somewhere.

Why duplicates matter

A duplicated example is trained on twice, which quietly doubles its weight against everything else in the set. They usually arrive from a re-run of an export script rather than on purpose, so they are found by content rather than by line.

Frequently asked questions

Why did my fine-tuning upload fail?
Almost always one line out of thousands: a line that is not valid JSON, a line that is not an object, an empty messages array, a missing or unknown role, empty content, or an example with no assistant turn. The provider reports a line number in a file you can no longer see, which is why checking before the upload is worth the minute it takes.
What is the difference between an error and a warning here?
An error is something that would stop the upload outright. A warning is something providers disagree about - tool and developer roles, two turns from the same role in a row, an example that does not end on an assistant turn, very short examples. Warnings train fine, but they usually mean the export script went wrong somewhere.
Why do duplicate examples matter?
An example that appears twice is trained on twice, which quietly doubles its weight against everything else in the set. Duplicates normally arrive from re-running an export rather than on purpose, so they are found by comparing content rather than line numbers.
Is my training data uploaded anywhere?
No. The file is read and checked inside the browser tab; nothing is sent to a server. That is deliberate - a fine-tuning set is usually the most sensitive file in a project.