The Trajectory tab
Every chat keeps a record of its work, and the Trajectory tab beside Chat replays that record as a ledger: the turns, the requests Oda sent to the model, the tool calls it made, and the timings it measured while it worked. Open it to see exactly how something was produced, or to inspect what a single request carried. Reading it changes nothing: it replays recorded work and sends nothing to a model.
Open the Trajectory tab
- Open a chat and look at the pair of tabs at the top of the conversation.
- Select Trajectory next to Chat.
- The tab shows while Developer tools is on. If you do not see it, turn the switch on in Settings > General.
- If you turn Developer tools off while the view is open, the view returns to Chat.
- Nothing here is a new request: opening the view, searching it and reading the timings spend no tokens.
Use the toolbar
The toolbar heads the view, above the timeline.
- Duration switches the timeline between equal-width operations (the default) and widths that follow each operation's recorded time. Its tooltip tells you what a press will do: Use actual duration or Use equal-width operations.
- Turns folds every turn at once, and its tooltip flips between Collapse turns and Expand turns. Calls does the same for the tool calls under every answer.
- The Search trajectory box filters the ledger as you type. Matching ignores case, and every word you type must appear in a record for it to stay. Clearing the box brings the whole ledger back, and in the timeline the spans that do not match dim.
Watch the timeline
Above the ledger, the timeline draws the same activity in three lanes: Input, Model and Tools.
- Point at a span for its facts: the total time, its start, and for model spans the wait for the first output and the decoding time, like
TTFT 500 ms · Decoding 1,500 ms.
- Scroll over the timeline to zoom around the pointer, and right-drag to pan a zoomed view.
- Drag across the timeline to draw a range. The ledger keeps the records active in that range lit and dims the rest; nothing is hidden.
- Select a span to open that record and clear the range. Select empty space, press Escape, or double-click to clear the range; right-click clears the selection without changing the zoom.
- When older records exist, the … strip at the left edge loads them; its tooltip reads Click to load earlier history.
- A chat with no recorded timings shows
No timing data.
Read the ledger
The ledger lists the chat's recorded activity in order. Each turn starts with a header reading Turn 1, Turn 2 and so on, and rows gather under Message and Step {step} headings. A compaction that stands alone takes its own Between turns section, headed Compaction {seq}.
- Every row carries a tag for the kind of record: SYSTEM, USER, CONTEXT, COMPACTED, ASSISTANT, TOOL and SUBTOOL.
- A row's state reads
Failed, Pending or Completed. A call with no recorded result yet shows as Pending while it runs, and one that was cut off is kept as Interrupted.
- Folded groups summarise themselves: a closed turn reads its counts, such as
2 steps · 6 tool calls, and a closed answer names the tools it called.
- A call a program made sits under its parent, tagged SUBTOOL, in the order it happened.
- Select a row to open its Event details; select empty space to clear the selection. A folded row opens with a click, or with Enter or Space once it has focus.
- Each model request carries a boundary mark like Request #1; a compaction's mark adds Compaction. Select a mark to open that request's details.
- Attachments in a record are counted beside it, as
Images ×2 or Files ×1.
- In a narrow window the tags shrink to icons and turn headers shorten to
#1, #2, so rows keep their room.
Inspect a record
Selecting a row opens Event details beside the ledger. On a narrow window the panel covers the view instead.
- Drag the panel's edge to resize it, double-click the edge to reset it, and Close details closes it.
- The tabs depend on the record: an answer offers Summary, Preview, Raw and, when a source was recorded, Source; a tool call offers Summary, Code, Result, Schema and Timing; a request offers Summary, Options, Usage and Timing; a compaction offers Summary and Raw Output; the system prompt records offer System Prompt and Tools, with a Diff first when the prompt changed during the chat.
- The panel also carries the record's own facts, such as Status, Purpose, Model, Provider, the tool call counts and retry facts (Retry, Scheduled, Retry delay).
- Timing lists Started, Total duration, TTFT, Generation and Throughput. A figure that was not recorded says so plainly, such as
Not recorded or First token unavailable, instead of estimating.
- Usage splits the request's tokens into rows such as Input, Cached, Cache created, Other, Output, Reasoning and Content, under This request and Session cumulative; with no figures recorded it reads
Usage not reported.
- Copy code, Copy output and Copy JSON put the exact content on your clipboard and confirm with Copied. In a code view, Original JSON shows the recorded arguments and Wrap lines wraps long lines; your wrapping choice is kept for the next code view you open.
- Click the Started value to switch it between your local time and a Unix timestamp; the tooltip reads Show local time or Show Unix timestamp.
- Inside a code view, the calls the program made read as Block #1, Block #2 and so on; Open tool call summary brings that call's record into view.
- When a tab holds nothing, the panel says so plainly:
No payload captured, No result captured, Schema unavailable, No output.
Page back through older history
A long chat opens at its newest records, so the oldest part of the record is not loaded at first.
- Select Load earlier history at the top of the ledger, or the … strip at the left of the timeline.
- While a page loads, the control is disabled and reads Loading earlier history….
- When the page arrives, the older records appear above and the row you were reading stays in place.
- The chat's earliest records, including its initial system prompt, appear only once you have paged back that far.
- The view keeps a long chat responsive by drawing only the records close to what you are reading.
- The same records are what the chat's log holds on disk; to take a copy as a file, see Download a chat log.
Questions, answered
What does the Duration control change?
It changes what decides the width of each span in the timeline. By default every operation gets the same width, so the strip shows order and grouping. Press Duration and the spans follow each operation's recorded time instead, so a long call takes a longer span. The tooltip tells you what the press will do: Use actual duration or Use equal-width operations.
Why are some rows dimmed in the ledger?
Because you drew a range on the timeline: the ledger keeps the records active in that range lit and dims the rest. It is a focus, not a filter, and nothing is hidden. Select a span, select empty space, or press Escape or double-click the timeline to clear the range.
What is a SUBTOOL row?
A call Oda made from inside a program it ran. Such calls sit under the call that made them, tagged SUBTOOL, in the order they happened, so you can follow the program's own steps before its result.
Why does a row say Interrupted?
The call was still running when its step or turn closed, so Oda recorded it as an interrupted call and its result was never recorded. Open the row to see what was kept, and run the work again if it is still needed. Oda's steps and tool results shows how the same call looks in the chat itself.
What do Failed, Pending and Completed mean?
Completed means the record finished. Pending means it has not finished yet: a call with no recorded result, or a compaction still running. Failed means it ended in an error, and the failure is kept in the record's details.
What is a Compaction row?
When a long chat no longer fits the model's reading space, Oda shortens its older part and records that as a compaction. In the ledger it shows as a Compaction {seq} row, and one that stands outside a turn sits in Between turns. While it runs it reads Compacting context…; a finished one reads Context compacted; a failed one reads Compaction failed, and one cut off by the chat ending keeps Compaction was interrupted before completion. The chat keeps its full record; the compaction changes what is sent to the model. See System prompt, context and compaction.
Why does a tool record open a Payload tab instead of Code?
The Code tab needs the recorded program together with its arguments. When those arguments were not recorded in a readable form, the record offers Payload with the raw arguments instead of guessing. For a readable program, Code shows the numbered source and offers Copy code.
How do I copy a record's code, output or JSON?
Open the record's Event details and use the copy control in the tab: Copy code for a program's source, Copy output for its result, Copy JSON for recorded JSON. The control confirms with Copied.
What does clicking the Started value switch?
It switches the Started value between your local time, down to milliseconds, and a Unix timestamp in seconds. The tooltip names the next format: Show Unix timestamp or Show local time.
Why does a failed request show a short message instead of the model's error?
When the request needed your DataMind sign-in and it no longer worked, the ledger shows the short sentence Oda uses, such as Your DataMind sign-in ended. Sign in again., Your password changed. Sign in to DataMind again. or DataMind refused access: {reason} Ask your administrator. Sign in again, then send the request; your chats are kept. When a model request failed an authentication check instead, the record shows API key is invalid and never the model service's own text. The full set of messages is in Failures and recovery and Troubleshooting.
Why do the tags and turn numbers change in a narrow window?
To keep the rows readable: when the view is narrow, the kind tags collapse to small icons and turn headers shorten from Turn 1 to #1. Widen the window and the full labels return.
Why does the timeline say No timing data?
Because the chat has nothing recorded to draw yet. The timeline builds its spans from recorded start and time facts; until the chat records some, it shows this line instead of an empty strip.