Running on your device · 0 bytes uploaded 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. - 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. Nothing in yet Paste, drop, or type to begin. Everything stays on this device. nothing validates until you press Validate & format Next door in AI - 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