jsonlkit.com
JSONL (JSON Lines) utilities, in the browser
Say hi →

Tool-Call JSONL Validator

updated 30 August 2026

Function calling is where the upload fails. The conversation validators check roles and content; none of them checks that arguments is a string rather than an object, that every tool_call_id is answered, or that the tool being called was ever declared. Those are the three that get a file rejected — after the upload, in a message that names neither the line nor the field.

Validate

Drop a .jsonl file here, or In your browser · nothing uploaded
Full report

Why this is separate from the other validators

The OpenAI and Anthropic validators check the conversation: roles, alternation, empty content, an assistant turn that exists. Tool calling adds a second structure on top of that — a declaration list, an id that has to round-trip, and an argument payload with its own encoding rules — and it is checked here rather than bloating both.

What it checks — OpenAI

What it checks — Anthropic

Mixed formats

Auto-detect works per record, which means it will happily read a file with some OpenAI records and some Anthropic ones — and then say so in the summary, in red. A fine-tune file has one format; a mixture is usually two exports concatenated, and the fix is to convert one side with the chat format converter before merging.

What it does not check

Types inside the arguments, string formats, enum membership, and anything else a full JSON Schema validator does. It checks the structure a provider rejects on, not the semantics of your tool. It also cannot tell you that the result you recorded is the result the tool would really return — a training file full of plausible but invented tool outputs validates perfectly and teaches the model to hallucinate confidently.