> 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.atif_export

Strict offline conversion from Gym rollout trajectories to ATIF v1.7.

## Module Contents

### Classes

| Name                                                         | Description                                                      |
| ------------------------------------------------------------ | ---------------------------------------------------------------- |
| [`AtifExportError`](#nemo_gym-atif_export-AtifExportError)   | A rollout cannot be represented by Gym's supported ATIF profile. |
| [`AtifExportResult`](#nemo_gym-atif_export-AtifExportResult) | -                                                                |
| [`ExportAtifConfig`](#nemo_gym-atif_export-ExportAtifConfig) | Configuration for `gym eval export --format atif`.               |
| [`_AgentGroup`](#nemo_gym-atif_export-_AgentGroup)           | -                                                                |
| [`_ModelCallIndex`](#nemo_gym-atif_export-_ModelCallIndex)   | -                                                                |

### Functions

| Name                                                                                 | Description                                                                             |
| ------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------- |
| [`_apply_turns`](#nemo_gym-atif_export-_apply_turns)                                 | -                                                                                       |
| [`_build_groups`](#nemo_gym-atif_export-_build_groups)                               | -                                                                                       |
| [`_canonical_conversation_copy`](#nemo_gym-atif_export-_canonical_conversation_copy) | Validate a redundant turn copy and compare its normalized supported fields.             |
| [`_encoded_trajectory`](#nemo_gym-atif_export-_encoded_trajectory)                   | -                                                                                       |
| [`_final_metrics`](#nemo_gym-atif_export-_final_metrics)                             | -                                                                                       |
| [`_index`](#nemo_gym-atif_export-_index)                                             | -                                                                                       |
| [`_json_value`](#nemo_gym-atif_export-_json_value)                                   | -                                                                                       |
| [`_message_content`](#nemo_gym-atif_export-_message_content)                         | -                                                                                       |
| [`_model_call_index`](#nemo_gym-atif_export-_model_call_index)                       | -                                                                                       |
| [`_parse_arguments`](#nemo_gym-atif_export-_parse_arguments)                         | -                                                                                       |
| [`_path_error`](#nemo_gym-atif_export-_path_error)                                   | -                                                                                       |
| [`_preflight_conversation`](#nemo_gym-atif_export-_preflight_conversation)           | Reject raw fields that supported Pydantic variants would silently erase.                |
| [`_preflight_model_call_refs`](#nemo_gym-atif_export-_preflight_model_call_refs)     | -                                                                                       |
| [`_preflight_model_ref`](#nemo_gym-atif_export-_preflight_model_ref)                 | -                                                                                       |
| [`_preflight_parts`](#nemo_gym-atif_export-_preflight_parts)                         | -                                                                                       |
| [`_preflight_raw_trajectory`](#nemo_gym-atif_export-_preflight_raw_trajectory)       | -                                                                                       |
| [`_preflight_training_metadata`](#nemo_gym-atif_export-_preflight_training_metadata) | -                                                                                       |
| [`_reasoning_text`](#nemo_gym-atif_export-_reasoning_text)                           | -                                                                                       |
| [`_reject_unknown_fields`](#nemo_gym-atif_export-_reject_unknown_fields)             | -                                                                                       |
| [`_resolve_model_call`](#nemo_gym-atif_export-_resolve_model_call)                   | -                                                                                       |
| [`_source_item_ids`](#nemo_gym-atif_export-_source_item_ids)                         | Return provider item identities that ATIF has no standard fields for.                   |
| [`_text_content`](#nemo_gym-atif_export-_text_content)                               | -                                                                                       |
| [`_tool_record_extra`](#nemo_gym-atif_export-_tool_record_extra)                     | -                                                                                       |
| [`_validate_json_value`](#nemo_gym-atif_export-_validate_json_value)                 | Reject Python values that cannot round-trip through UTF-8 JSON unchanged.               |
| [`export_rollouts_to_atif`](#nemo_gym-atif_export-export_rollouts_to_atif)           | Validate a rollout JSONL completely, then atomically publish ATIF files and a manifest. |
| [`gym_rollout_to_atif`](#nemo_gym-atif_export-gym_rollout_to_atif)                   | Convert one rollout row, rejecting any structure Gym cannot represent completely.       |

### Data

[`_CONVERSATION_ADAPTER`](#nemo_gym-atif_export-_CONVERSATION_ADAPTER)

[`_KNOWN_INCOMPLETE_FINISH_REASONS`](#nemo_gym-atif_export-_KNOWN_INCOMPLETE_FINISH_REASONS)

[`_TRAINING_METADATA_FIELDS`](#nemo_gym-atif_export-_TRAINING_METADATA_FIELDS)

### API

```python
class nemo_gym.atif_export.AtifExportError()
```

**Bases:** [ConfigError](/nemo-gym/nemo_gym/config_types#nemo_gym-config_types-ConfigError)

A rollout cannot be represented by Gym's supported ATIF profile.

```python
class nemo_gym.atif_export.AtifExportResult(
    output_dirpath: pathlib.Path,
    trajectory_count: int,
    manifest_fpath: pathlib.Path
)
```

Dataclass

**`manifest_fpath`** `Path`

---

**`output_dirpath`** `Path`

---

**`trajectory_count`** `int`

---

```python
class nemo_gym.atif_export.ExportAtifConfig()
```

**Bases:** [BaseNeMoGymCLIConfig](/nemo-gym/nemo_gym/config_types#nemo_gym-config_types-BaseNeMoGymCLIConfig)

Configuration for `gym eval export --format atif`.

**`agent_version`** `str = Field(min_length=1)`

---

**`format`** `Literal['atif'] = 'atif'`

---

**`output_dirpath`** `Path`

---

**`rollouts_jsonl_fpath`** `Path`

---

**`session_id`** `str = Field(min_length=1)`

---

```python
nemo_gym.atif_export.ExportAtifConfig.reject_blank_identity(
    value: str
) -> str
```

classmethod

```python
class nemo_gym.atif_export._AgentGroup(
    question: list[typing.Any],
    reasoning: list[typing.Any],
    answer: list[typing.Any],
    step: nemo_gym.atif_v1_7.AtifStep
)
```

Dataclass

**`answer`** `list[Any]`

---

**`question`** `list[Any]`

---

**`reasoning`** `list[Any]`

---

**`step`** `AtifStep`

---

```python
class nemo_gym.atif_export._ModelCallIndex(
    calls: list[nemo_gym.rollout_observability.TrajectoryModelCall],
    by_id: dict[str, list[int]],
    by_response: dict[tuple[str, str, str], list[int]]
)
```

Dataclass

**`by_id`** `dict[str, list[int]]`

---

**`by_response`** `dict[tuple[str, str, str], list[int]]`

---

**`calls`** `list[TrajectoryModelCall]`

---

```python
nemo_gym.atif_export._apply_turns(
    trajectory: nemo_gym.rollout_observability.TrajectoryRecord,
    groups: list[nemo_gym.atif_export._AgentGroup]
) -> set[int]
```

```python
nemo_gym.atif_export._build_groups(
    trajectory: nemo_gym.rollout_observability.TrajectoryRecord,
    invocation: typing.Any
) -> tuple[list[nemo_gym.atif_v1_7.AtifStep], list[nemo_gym.atif_export._AgentGroup]]
```

```python
nemo_gym.atif_export._canonical_conversation_copy(
    value: typing.Any,
    path: str
) -> typing.Any
```

Validate a redundant turn copy and compare its normalized supported fields.

```python
nemo_gym.atif_export._encoded_trajectory(
    trajectory: nemo_gym.atif_v1_7.AtifTrajectoryV1_7
) -> bytes
```

```python
nemo_gym.atif_export._final_metrics(
    groups: list[nemo_gym.atif_export._AgentGroup],
    total_steps: int
) -> nemo_gym.atif_v1_7.AtifFinalMetrics
```

```python
nemo_gym.atif_export._index(
    row: dict[str, typing.Any],
    key: str,
    path: str
) -> int
```

```python
nemo_gym.atif_export._json_value(
    value: typing.Any
) -> typing.Any
```

```python
nemo_gym.atif_export._message_content(
    item: typing.Any,
    path: str
) -> nemo_gym.atif_v1_7.AtifContent
```

```python
nemo_gym.atif_export._model_call_index(
    calls: list[nemo_gym.rollout_observability.TrajectoryModelCall]
) -> nemo_gym.atif_export._ModelCallIndex
```

```python
nemo_gym.atif_export._parse_arguments(
    call: nemo_gym.openai_utils.NeMoGymResponseFunctionToolCall,
    path: str
) -> dict[str, typing.Any]
```

```python
nemo_gym.atif_export._path_error(
    path: str,
    detail: str
) -> nemo_gym.atif_export.AtifExportError
```

```python
nemo_gym.atif_export._preflight_conversation(
    conversation: typing.Any,
    path: str
) -> None
```

Reject raw fields that supported Pydantic variants would silently erase.

```python
nemo_gym.atif_export._preflight_model_call_refs(
    value: typing.Any,
    path: str
) -> None
```

```python
nemo_gym.atif_export._preflight_model_ref(
    value: typing.Any,
    path: str
) -> None
```

```python
nemo_gym.atif_export._preflight_parts(
    value: typing.Any,
    path: str,
    supported_fields: dict[str, frozenset[str]]
) -> None
```

```python
nemo_gym.atif_export._preflight_raw_trajectory(
    value: typing.Any
) -> None
```

```python
nemo_gym.atif_export._preflight_training_metadata(
    item: dict[typing.Any, typing.Any],
    path: str
) -> None
```

```python
nemo_gym.atif_export._reasoning_text(
    items: list[nemo_gym.openai_utils.NeMoGymResponseReasoningItem],
    path: str
) -> str | None
```

```python
nemo_gym.atif_export._reject_unknown_fields(
    value: dict[typing.Any, typing.Any],
    allowed: set[str] | frozenset[str],
    path: str
) -> None
```

```python
nemo_gym.atif_export._resolve_model_call(
    ref: nemo_gym.rollout_observability.ModelCallRef,
    calls: nemo_gym.atif_export._ModelCallIndex,
    path: str
) -> tuple[int, nemo_gym.rollout_observability.TrajectoryModelCall]
```

```python
nemo_gym.atif_export._source_item_ids(
    group: nemo_gym.atif_export._AgentGroup
) -> dict[str, typing.Any]
```

Return provider item identities that ATIF has no standard fields for.

```python
nemo_gym.atif_export._text_content(
    value: typing.Any,
    path: str
) -> nemo_gym.atif_v1_7.AtifContent
```

```python
nemo_gym.atif_export._tool_record_extra(
    record: typing.Any,
    source_item_id: str | None = None
) -> dict[str, typing.Any] | None
```

```python
nemo_gym.atif_export._validate_json_value(
    value: typing.Any,
    path: str
) -> None
```

Reject Python values that cannot round-trip through UTF-8 JSON unchanged.

```python
nemo_gym.atif_export.export_rollouts_to_atif(
    config: nemo_gym.atif_export.ExportAtifConfig
) -> nemo_gym.atif_export.AtifExportResult
```

Validate a rollout JSONL completely, then atomically publish ATIF files and a manifest.

```python
nemo_gym.atif_export.gym_rollout_to_atif(
    rollout: dict[str, typing.Any],
    session_id: str,
    agent_version: str
) -> nemo_gym.atif_v1_7.AtifTrajectoryV1_7
```

Convert one rollout row, rejecting any structure Gym cannot represent completely.

```python
nemo_gym.atif_export._CONVERSATION_ADAPTER = TypeAdapter(list[NeMoGymResponseInputItem])
```

```python
nemo_gym.atif_export._KNOWN_INCOMPLETE_FINISH_REASONS = frozenset({'aborted', 'canceled', 'cancelled', 'content_filter', 'failed', 'inco...
```

```python
nemo_gym.atif_export._TRAINING_METADATA_FIELDS = frozenset({'prompt_token_ids', 'generation_token_ids', 'generation_log_probs', '...
```