Your files stay on your device

# Fine-tuning JSONL formatter and validator

Paste training data, validate it against the target's schema, and format it to one clean record per line. Every deviation named, nothing uploaded.
target-specific validation · cap 8 MB · no upload, the file never leaves this tabValidate & formatClearOpenAI chat fine-tuningOpenAI legacy completionsGeneric JSONLJSONL inJSON array in

Paste data or open a file, then press Validate & format.

Format and validate the data first: the split runs on the valid lines.

- openai-chat: each line one object with a non-empty "messages" array; roles limited to system, developer, user, assistant, tool; content a string or an array of text parts; optional numeric weight.
- openai-completions: each line one object with string (or string-array) "prompt" and "completion"; optional "suffix" and weight.
- Duplicate keys keep JSON.parse semantics, last value wins. And the loss ledger says so. Number spellings normalize (1.0 → 1) and that is reported too, with counts and the first line it happened on.
- Unknown top-level keys are preserved verbatim, named in the ledger: the formatter never drops your data, and never invents fields a target expects.

- Chat fine-tuning: clean

Two valid records; one with a training weight.

- Chat fine-tuning: with errors

Line 2 has an unknown role; line 3 is not JSON; both are named, not dropped silently.

- Legacy completions

Prompt/completion pairs: the legacy fine-tuning shape.

- JSON array in, JSONL out

A pretty JSON array becomes one record per line; the wrapper removal is reported.

Paste, drop, or type to begin. Everything stays on this device.

## More AI tools

- [Chat export viewer](/ai/chat-export)
- [JSON converter](/json/convert)
[All AI tools](/ai)

---

Canonical HTML: https://nutter.tools/ai/jsonl-formatter/
Markdown version: https://nutter.tools/ai/jsonl-formatter/index.md
Plain-text version: https://nutter.tools/ai/jsonl-formatter/index.txt
Agent index: https://nutter.tools/llms.txt

