Paste OpenAI, Anthropic, or generic JSON agent logs. Each tool call becomes a card with its input, output, and status.
This tool runs entirely in your browser. What you enter is never sent anywhere.Your input is never sent anywhere.
DetailsTool call log (JSON)
Log format
Read Function Calling Logs Without Matching IDs by Hand
When you debug an AI agent, the most useful part of the trace is the function calling history: which tool ran, with what arguments, and what came back. In raw JSON that history is hard to follow. Arguments are often a JSON string inside a JSON object, and each call and its result sit in separate objects.
Paste the log and the viewer turns it into one card per tool call, in the order the calls appear in your log. OpenAI results are matched to calls by tool_call_id and Anthropic results by tool_use_id, so you do not have to cross-check IDs by eye. A call with no result in the log is marked Pending.
It reads OpenAI Chat Completions messages, Anthropic Messages content blocks (tool_use and tool_result), and any array of objects with keys like name, input, and output. Parsing happens in your browser.
When a Formatted Agent Trace Helps
Debugging an agent that picked the wrong tool
See which tool was called, with which arguments, and what it returned, in order. A bad argument in call 3 is easy to spot when each call has its own card.
Sharing a trace in a pull request or Slack thread
Raw JSON is hard for a reviewer to read. Copy the cards as Markdown and paste them into a PR, an issue, or a ticket.
Finding slow or failing tools
The summary shows total calls, unique tools, and the success and error counts, plus a per-tool call count. If your log has durations, it also adds them up. Filter to Error to see only the failures.
Comparing OpenAI and Anthropic traces
The two APIs structure tool calls differently. Both are shown in the same card layout, so you can compare what the model did without reading two formats.
How to Format a Tool Call Log in 4 Steps
- Paste your agent log (JSON or JSON Lines) into the text box, or load one of the samples.
- Leave Log format on Auto-detect. If the result looks wrong, pick OpenAI, Anthropic, or Generic JSON array by hand.
- Click Format log. Each tool call appears as a card with its input, output, and status.
- Filter by tool name or status, expand or collapse the cards, or copy what you see as Markdown.
Note: The log is parsed in your browser and is not sent to our server.
Limits and Things to Check
- Format detection is based on common log shapes. A custom format may need the Generic JSON array option, with keys named like name, input, and output.
- OpenAI messages have no error flag. A matched result shows as Success unless its JSON has a top-level error field, in which case it shows as Error.
- Cards follow the order of your log. The viewer does not sort by timestamp, and timestamps are shown as written in the log.
- Durations are read only from generic logs (duration_ms, duration, elapsed_ms, elapsed). Numbers are treated as milliseconds with no unit conversion.
- Copy as Markdown copies only the cards that match your current filters.
- Tool call logs can contain API keys, tokens, or customer data. Parsing stays in your browser, but check the Markdown before you paste it somewhere shared.
- Very large logs, with thousands of calls, may take a while to render.
Supported JSON Formats: OpenAI, Anthropic, and Generic
These shapes are detected automatically. If a log is not detected, select the format by hand.
| Format | What it looks for | How calls and results are matched |
|---|---|---|
| OpenAI Chat Completions | A messages array (or an object with messages or choices[].message) containing tool_calls, role "tool", and tool_call_id. The older function_call field also works. | By tool_call_id. A tool message with no matching ID goes to the earliest call without a result. |
| Anthropic Messages API | Blocks with type "tool_use" and type "tool_result" inside content arrays, including an object with a messages array. | By tool_use_id. A tool_result with is_error set to true is shown as Error. |
| Generic JSON array | An array (or an object with logs, events, tool_calls, or steps) of objects with keys like tool, name, input, arguments, output, result, timestamp. | One card per object, in array order. Status comes from the error, status, success, or ok fields. |
Logs from other agent frameworks may work as a generic array when each entry has a name-like key and an input-like or output-like key. If a log is not recognized, rename the keys to name, input, and output and try again.
Function Calling vs. tool_use: How the Log Formats Differ
What a tool call log contains, and why raw JSON is slow to read.
What a tool call log contains
A model with function calling (OpenAI) or tool use (Anthropic) does not run tools itself. It asks your application to run a tool with certain arguments, your code runs it, and you send the result back. The record of those requests and results is the tool call log.
The more steps an agent takes, the longer and harder to read that log gets.
OpenAI and Anthropic structure tool calls differently
In OpenAI Chat Completions, the assistant message has a tool_calls array, and each call carries its arguments as a JSON string. The result comes back as a separate message with role: "tool" and a tool_call_id.
In Anthropic Messages, the assistant message holds a tool_use block, and the result is a tool_result block in a later user message, linked by tool_use_id.
In both, the call and the result are separate objects tied together by an ID.
Why a timeline is easier than raw JSON
In a raw log, the arguments may be a JSON string nested inside JSON, and the matching result may be several messages away. The viewer parses string arguments into readable JSON and places each result under its call.
That lets you scroll through the run and find the call where the arguments went wrong or the tool returned an error.
Handling logs that contain sensitive data
Tool results often include user records, internal URLs, or credentials the agent was given. This page parses your log in the browser and does not send it to our server.
The risk comes later: check the Markdown for sensitive values before you paste it into a ticket, a public issue, or a chat channel.
Why Your JSON Will Not Parse or Calls Show as Pending
Calls show as Pending because only part of the log was pasted
You copied only the assistant message with tool_calls, or only the tool messages. Without both sides, the viewer cannot pair a call with its result, so the cards show Pending.
💡 See the solution▼
The log is not valid JSON
A copy cut off partway, a trailing comma, or single quotes instead of double quotes makes the text unparseable, and you get the parse error.
💡 See the solution▼
A custom log shows the wrong tool names or empty input and output
Your logger uses unusual keys such as cmd or payload, so the viewer cannot tell which key is the tool name and which are the input and output.
💡 See the solution▼
Losing the call you need in a long log
A run with dozens or hundreds of tool calls makes the timeline long, and scrolling to the failed call takes a while.
💡 See the solution▼
Questions About Parsing OpenAI, Anthropic, and Custom Logs
Q.Which log formats does the viewer support?
A. Three: OpenAI Chat Completions messages (tool_calls and role "tool" messages), Anthropic Messages content blocks (tool_use and tool_result), and any array of objects with keys like name, input, and output. The format is detected automatically, and you can also pick one by hand.
Q.Is my log uploaded anywhere?
A. No. The log is parsed by JavaScript in your browser and is not sent to our server. Still, check what you paste before you share the formatted result, since tool call logs can contain API responses with customer data.
Q.Does it match each tool call with its result?
A. Yes. OpenAI results are matched to calls by tool_call_id, and Anthropic results by tool_use_id. Each pair becomes one card. A call with no result in the log is marked Pending. If an OpenAI tool message has no matching ID, it is attached to the earliest call that has no result yet.
Q.Can I use it with a custom log format?
A. Often, yes. If your log is an array of objects with a tool-name key (tool, name, action, function, or tool_name) and input or output keys (input, arguments, params, output, result, response), it is read as a generic array. If it is not recognized, choose Generic JSON array by hand, or rename your keys to name, input, and output.
Q.How are Success and Error decided?
A. For Anthropic logs, a tool_result with is_error set to true is an Error. OpenAI messages have no error flag, so a result is marked Error only when its JSON has a top-level error field. In a generic array, the error field and the status, success, or ok field decide the status. If neither is present, an entry with output is Success and an entry with only input is Pending.
Q.Does it show how long each tool call took?
A. Only for generic logs that include a number in duration_ms, duration, elapsed_ms, or elapsed. The value is shown as milliseconds with no unit conversion. OpenAI and Anthropic message logs do not carry durations, so those cards show none.
Q.Can I paste a full API response or a JSONL file?
A. Yes to both. A Chat Completions response with a choices array, a request body with a messages array, and a Messages API response with a content array are all read. A file with one JSON object per line (JSON Lines) is read as an array.
Q.Can I copy the result into a pull request or a ticket?
A. Yes. Copy as Markdown gives you a heading for each tool call, followed by its input and output in JSON code blocks. It copies only the cards that match your current filters, so you can filter to errors first and share just those.
Your feedback
makes this tool better.
Tell us which features you'd like, what should be fixed, or which new tool you'd like to see. An engineer reads every submission and uses it to guide development.