> This page is for version 0.3.0.
> For other versions, use one of these documentation indexes:
> - Main (default): https://docs.nvidia.com/nemo/gym/main/llms.txt
> - 0.7.0: https://docs.nvidia.com/nemo/gym/v0.7.0/llms.txt
> - 0.6.0: https://docs.nvidia.com/nemo/gym/v0.6.0/llms.txt
> - 0.5.1: https://docs.nvidia.com/nemo/gym/v0.5.1/llms.txt
> - 0.5.0: https://docs.nvidia.com/nemo/gym/v0.5.0/llms.txt
> - 0.4.0: https://docs.nvidia.com/nemo/gym/v0.4.0/llms.txt
> - 0.3.0: https://docs.nvidia.com/nemo/gym/v0.3.0/llms.txt
> - 0.2.1: https://docs.nvidia.com/nemo/gym/v0.2.1/llms.txt

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.nvidia.com/nemo/gym/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.nvidia.com/nemo/gym/_mcp/server.

# nemo_gym.rollouts.trajectory_builder

Building a rollout's trajectory record from its model calls and the observations its agent reported.

## Module Contents

### Functions

| Name                                                                                           | Description                                                                                     |
| ---------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- |
| [`_attach_trajectory_record`](#nemo_gym-rollouts-trajectory_builder-_attach_trajectory_record) | -                                                                                               |
| [`_build_trajectory_record`](#nemo_gym-rollouts-trajectory_builder-_build_trajectory_record)   | -                                                                                               |
| [`_has_observation_gap`](#nemo_gym-rollouts-trajectory_builder-_has_observation_gap)           | -                                                                                               |
| [`_nonnegative_int`](#nemo_gym-rollouts-trajectory_builder-_nonnegative_int)                   | -                                                                                               |
| [`_trajectory_identity`](#nemo_gym-rollouts-trajectory_builder-_trajectory_identity)           | -                                                                                               |
| [`_turn_content`](#nemo_gym-rollouts-trajectory_builder-_turn_content)                         | Split one captured model call into the turn's question, answer, reasoning, and tool-call count. |
| [`_turns_from_model_calls`](#nemo_gym-rollouts-trajectory_builder-_turns_from_model_calls)     | Build policy turns from captured calls for an agent that sent no trajectory.                    |

### Data

[`logger`](#nemo_gym-rollouts-trajectory_builder-logger)

### API

```python
nemo_gym.rollouts.trajectory_builder._attach_trajectory_record(
    row: dict[str, typing.Any],
    result: dict[str, typing.Any]
) -> None
```

```python
nemo_gym.rollouts.trajectory_builder._build_trajectory_record(
    row: dict[str, typing.Any],
    result: dict[str, typing.Any]
) -> nemo_gym.trajectory.trajectory_record.TrajectoryRecord
```

```python
nemo_gym.rollouts.trajectory_builder._has_observation_gap(
    result: dict[str, typing.Any],
    code: str
) -> bool
```

```python
nemo_gym.rollouts.trajectory_builder._nonnegative_int(
    value: typing.Any
) -> typing.Optional[int]
```

```python
nemo_gym.rollouts.trajectory_builder._trajectory_identity(
    row: dict[str, typing.Any]
) -> tuple[str, str]
```

```python
nemo_gym.rollouts.trajectory_builder._turn_content(
    request: typing.Any,
    response: typing.Any
) -> tuple[typing.Any, typing.Any, typing.Any, int]
```

Split one captured model call into the turn's question, answer, reasoning, and tool-call count.

Handles the three dialects the Model Server captures: Responses API output items, chat-completions
messages, and Anthropic Messages content blocks.

```python
nemo_gym.rollouts.trajectory_builder._turns_from_model_calls(
    task_id: str,
    rollout_id: str,
    invocations: list[nemo_gym.trajectory.trajectory_record.AgentInvocation],
    model_calls: list[nemo_gym.trajectory.trajectory_record.TrajectoryModelCall],
    resolved: typing.Any,
    verifier_invocations: collections.abc.Iterable[nemo_gym.trajectory.trajectory_record.VerifierInvocation] = (),
    compactions: collections.abc.Sequence[nemo_gym.trajectory.trajectory_record.ContextCompactionObservation] = ()
) -> list[nemo_gym.trajectory.trajectory_record.TrajectoryTurn]
```

Build policy turns from captured calls for an agent that sent no trajectory.

A call belongs to the invocation whose `model_calls` reference it. Unreferenced calls stay
in the raw evidence but do not become turns: even a single-agent rollout may capture judge
or auxiliary calls that do not belong to the agent. Compaction helpers remain invocation-owned
calls for token accounting, but never become policy turns, even when agent ownership claims
conflict. Preserve those claims for validation rather than choosing which owner is correct.
Explicit verifier ownership also excludes a call from turns when an agent incorrectly references it;
retain both ownership claims for validation.

```python
nemo_gym.rollouts.trajectory_builder.logger = logging.getLogger(__name__)
```