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

Wire contracts for environment servers.

## Module Contents

### Classes

| Name                                                                 | Description                                                 |
| -------------------------------------------------------------------- | ----------------------------------------------------------- |
| [`BaseEpisodeRequest`](#nemo_gym-episode_types-BaseEpisodeRequest)   | Carry environment-neutral identity and typed task input.    |
| [`BaseEpisodeResponse`](#nemo_gym-episode_types-BaseEpisodeResponse) | Return either a typed result or a handled failure.          |
| [`EpisodeFailure`](#nemo_gym-episode_types-EpisodeFailure)           | Describe a handled episode failure.                         |
| [`EpisodeId`](#nemo_gym-episode_types-EpisodeId)                     | Identify one physical attempt of a logical rollout.         |
| [`MaterializedTask`](#nemo_gym-episode_types-MaterializedTask)       | Carry durable task identity and protocol-shaped task input. |
| [`TaskId`](#nemo_gym-episode_types-TaskId)                           | Identify one task within a run-qualified taskset.           |

### Data

[`EpisodeResultT`](#nemo_gym-episode_types-EpisodeResultT)

[`TaskInputT`](#nemo_gym-episode_types-TaskInputT)

### API

```python
class nemo_gym.episode_types.BaseEpisodeRequest()
```

**Bases:** `BaseModel`, `Generic[TaskInputT]`

Carry environment-neutral identity and typed task input.

**`episode_id`** `EpisodeId`

---

**`model_config`** `= ConfigDict(extra='forbid')`

---

**`task`** `MaterializedTask[TaskInputT]`

---

```python
class nemo_gym.episode_types.BaseEpisodeResponse()
```

**Bases:** `BaseModel`, `Generic[EpisodeResultT]`

Return either a typed result or a handled failure.

**`episode_id`** `EpisodeId`

---

**`failure`** `EpisodeFailure | None = None`

---

**`model_config`** `= ConfigDict(extra='forbid')`

---

**`result`** `EpisodeResultT | None = None`

---

**`task_id`** `TaskId`

---

```python
nemo_gym.episode_types.BaseEpisodeResponse.validate_result() -> typing_extensions.Self
```

```python
class nemo_gym.episode_types.EpisodeFailure()
```

**Bases:** `BaseModel`

Describe a handled episode failure.

**`message`** `str = Field(max_length=2000)`

---

**`model_config`** `= ConfigDict(extra='forbid')`

---

**`terminal`** `bool`

---

```python
class nemo_gym.episode_types.EpisodeId()
```

**Bases:** `BaseModel`

Identify one physical attempt of a logical rollout.

**`attempt`** `int = Field(default=0, ge=0)`

---

**`capture_key`** `str`

Return the attempt-qualified key used by capture routes.

---

**`model_config`** `= ConfigDict(extra='forbid', frozen=True)`

---

**`rollout_id`** `str`

---

```python
nemo_gym.episode_types.EpisodeId.reserve_attempt_suffix(
    rollout_id: str
) -> str
```

classmethod

Keep the derived capture key injective without changing existing keys.

```python
class nemo_gym.episode_types.MaterializedTask()
```

**Bases:** `BaseModel`, `Generic[TaskInputT]`

Carry durable task identity and protocol-shaped task input.

**`model_config`** `= ConfigDict(extra='forbid')`

---

**`task_id`** `TaskId`

---

**`task_input`** `TaskInputT`

---

```python
class nemo_gym.episode_types.TaskId()
```

**Bases:** `BaseModel`

Identify one task within a run-qualified taskset.

**`model_config`** `= ConfigDict(extra='forbid', frozen=True)`

---

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

---

**`taskset`** `str`

---

```python
nemo_gym.episode_types.EpisodeResultT = TypeVar('EpisodeResultT')
```

```python
nemo_gym.episode_types.TaskInputT = TypeVar('TaskInputT', bound=BaseModel)
```