← SkillSafe / SFT Desk

Is this fine-tuning dataset ready to train?

Paste or drop the JSONL for one run - SFT, DPO, ORPO, KTO or GRPO - and, if you have it, the eval split. Your browser reads every row and checks it: lines that are not JSON, rows shaped for another method, conversations with no assistant turn, empty answers, flat text and pre-rendered chat templates that make the model train on the user turns too, train prompts that are also in the eval split, ShareGPT rows left unconverted, duplicates, one prompt with two answers, rows longer than max_length, the 1,000-row SFT floor, real data under 25%, refusals, identical chosen and rejected, KTO labels and personal data. Free, before you sign in, and nothing is uploaded - with a clean export. Then pick a lane: the audit judges what the sampled rows teach and names the rows to drop, and the card lane writes the six-field dataset card the run is gated on.

The products, people and rows in the examples are invented. The first three are audits, the last two dataset cards; each comes with a saved model reply, so you can see the whole page without signing in or spending a credit.

Paid run

The audit rates format, template, content and mix, confirms or dismisses every flag below, reads the sampled rows for what rules cannot see, and names the rows to drop.

nothing pasted yet
Drop a .jsonl or .json file (read in this browser, never uploaded), or
Eval split (optional - paste it to check train prompts against it)
or
Paste the rows to price the run.

What this does, and what it does not

The check is a reading of the text: nothing is trained, tokenized or sent anywhere. Each line is parsed as JSON; each row's shape is worked out from its keys and held to the method you pick (or the one its shape implies); conversations are walked turn by turn; duplicates are found by exact match after collapsing whitespace and case, and near-duplicates by the same words ignoring case, punctuation and numbers; train prompts are matched against the eval split you paste; provenance is read from a source, origin or synthetic field when the rows carry one. Lengths are estimates at about four characters per token - your model's tokenizer decides, so treat a row near max_length as a row to measure. The page cannot see how your trainer masks the loss, which template it applies at inference, or whether an answer is right: the audit reads a sample of rows for that, and the card asks you for the rest.

The paid lanes see a sample of up to 40 rows - the rows the flags point at first, then rows spread across the file - with email addresses, phone numbers and credential values replaced by placeholders, plus the page's facts. Every quote they return is checked against the rows that were sent, every number in the card against the page's own counts. Your rows stay in this browser unless you run a lane. Derived from the agent skill @wshobson/dataset-curation by Seth Hobson (wshobson/agents, MIT). Sources are listed in llms.txt.