The format friction
Conversations are natural to write as lines and awkward to write as JSON. Hand-editing a messages array means escaping every quote and newline, and one missing comma invalidates the whole request.
Write the conversation the way you would say it, and take the JSON out the other side.
Why the providers differ
OpenAI treats the system prompt as the first message in the array. Anthropic takes it as a separate top-level field and does not accept a system role inside messages.
This is the single most common porting bug between the two, and it fails in a confusing way: the request is accepted and the system prompt is silently ignored or rejected. Selecting the target format here handles the move correctly.
Building training data
The JSONL option emits one compact line, which is what a fine-tuning upload expects. Build your examples one at a time, collect the lines into a file, then run the whole thing through the JSONL validator before uploading.