Conversation Format Converter
Move a transcript between OpenAI messages, Anthropic messages, ShareGPT, JSONL, a plain transcript and Alpaca, in any direction.
Converted back from the output and compared: every turn survived unchanged.
- system / user / assistant / tool
- 1 / 2 / 2 / 0
- Characters of message text
- 343
- Estimated tokens of message text
- ≈ 86
- Output characters
- 637
- Format overhead vs the text itself
- 294 chars
Six formats, all describing the same thing, none of them quite compatible. It is the tax you pay for using more than one training library: a dataset scraped in ShareGPT shape will not load into a fine-tuning job that wants JSONL of OpenAI message lists, an evaluation harness wants a plain transcript, and the Alpaca corpus everyone starts from is single-turn in a world that is not.
Why the round trip is the headline
Any converter can produce output that looks right. The question is what it quietly changed, and the only honest way to answer it is to convert the output back with the same rules and compare. That is what the top line reports. When it says every turn survived, the two formats really are interchangeable for your conversation. When it lists differences, you are looking at a genuine limit — most often Alpaca, which has one instruction and one output and therefore cannot hold a five-turn exchange no matter how the fields are stretched.
The joins that cannot be undone
Two conversions lose information in a way that survives a naive eyeball check. Several system turns become one system string for Anthropic, and the blank line between them is not a boundary you can recover. Alpaca's instruction and input become one user turn for the same reason. Both are reported every time they happen, because a dataset built on a conversion that lost the split is a dataset that trains on subtly wrong prompts — and that is the kind of error that shows up only as a model that is mysteriously worse than the last one.
What it deliberately does not do
It does not carry tool calls. A tool call is a request-shaped object with an id, a name and JSON arguments, and its counterpart is a result that has to point back at that id; converting those is a different job with different failure modes, and it has its own tool. It also converts one conversation at a time, and says how many records in your file it left alone rather than silently taking the first.