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

## Module Contents

### Classes

| Name                                                                                             | Description                                                                 |
| ------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------- |
| [`BaseMultiRewardVerifyResponse`](#nemo_gym-base_resources_server-BaseMultiRewardVerifyResponse) | Base verify response for environments with multiple reward objectives.      |
| [`BaseResourcesServer`](#nemo_gym-base_resources_server-BaseResourcesServer)                     | -                                                                           |
| [`BaseResourcesServerConfig`](#nemo_gym-base_resources_server-BaseResourcesServerConfig)         | -                                                                           |
| [`BaseRunRequest`](#nemo_gym-base_resources_server-BaseRunRequest)                               | -                                                                           |
| [`BaseSeedSessionRequest`](#nemo_gym-base_resources_server-BaseSeedSessionRequest)               | -                                                                           |
| [`BaseSeedSessionResponse`](#nemo_gym-base_resources_server-BaseSeedSessionResponse)             | -                                                                           |
| [`BaseVerifyRequest`](#nemo_gym-base_resources_server-BaseVerifyRequest)                         | -                                                                           |
| [`BaseVerifyResponse`](#nemo_gym-base_resources_server-BaseVerifyResponse)                       | -                                                                           |
| [`MCPServerMetadata`](#nemo_gym-base_resources_server-MCPServerMetadata)                         | Metadata returned from /seed\_session for per-rollout Gym MCP access.       |
| [`ResourcesCloseSessionRequest`](#nemo_gym-base_resources_server-ResourcesCloseSessionRequest)   | Close resources-server state.                                               |
| [`ResourcesCloseSessionResponse`](#nemo_gym-base_resources_server-ResourcesCloseSessionResponse) | Confirm resources-server state was closed.                                  |
| [`ResourcesSeedSessionRequest`](#nemo_gym-base_resources_server-ResourcesSeedSessionRequest)     | Idempotently initialize resources state under a caller-assigned identifier. |
| [`ResourcesSeedSessionResponse`](#nemo_gym-base_resources_server-ResourcesSeedSessionResponse)   | Confirm resources state and return optional agent access.                   |
| [`ResourcesVerifyRequest`](#nemo_gym-base_resources_server-ResourcesVerifyRequest)               | Carry typed environment output to a resources server.                       |
| [`ReverifyMode`](#nemo_gym-base_resources_server-ReverifyMode)                                   | -                                                                           |
| [`SimpleResourcesServer`](#nemo_gym-base_resources_server-SimpleResourcesServer)                 | -                                                                           |

### Functions

| Name                                                                         | Description                                                     |
| ---------------------------------------------------------------------------- | --------------------------------------------------------------- |
| [`normalize_tool_name`](#nemo_gym-base_resources_server-normalize_tool_name) | Map a trajectory tool-call name to the server's bare tool name. |

### Data

[`NEMO_GYM_MCP_METADATA_KEY`](#nemo_gym-base_resources_server-NEMO_GYM_MCP_METADATA_KEY)

[`NEMO_GYM_MCP_SESSION_TOKEN_HEADER`](#nemo_gym-base_resources_server-NEMO_GYM_MCP_SESSION_TOKEN_HEADER)

[`RESERVED_MCP_TOOL_NAMES`](#nemo_gym-base_resources_server-RESERVED_MCP_TOOL_NAMES)

[`VerificationInputT`](#nemo_gym-base_resources_server-VerificationInputT)

[`_MCP_TOKEN_SALT`](#nemo_gym-base_resources_server-_MCP_TOKEN_SALT)

### API

```python
class nemo_gym.base_resources_server.BaseMultiRewardVerifyResponse()
```

**Bases:** [BaseVerifyResponse](#nemo_gym-base_resources_server-BaseVerifyResponse)

Base verify response for environments with multiple reward objectives.

Subclass this response instead of declaring `reward_components` on an
environment-specific `BaseVerifyResponse` subclass. The mapping is required, and
its objective keys should remain consistent across every task in the environment.

Set the inherited `reward` to the scalar aggregate expected by single-reward
consumers. To include individual objectives in aggregate metrics, also expose them
as top-level numeric fields because metrics do not descend into this mapping. See
`resources_servers/example_tool_call_multireward` for a complete example.

**`reward_components`** `dict[str, float]`

---

```python
class nemo_gym.base_resources_server.BaseResourcesServer()
```

**Bases:** [BaseServer](/nemo/gym/nemo-gym/nemo_gym/server_utils#nemo_gym-server_utils-BaseServer)

**`config`** `BaseResourcesServerConfig`

---

```python
class nemo_gym.base_resources_server.BaseResourcesServerConfig()
```

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

**`REVERIFY_MODE`** `ReverifyMode = ReverifyMode.UNKNOWN`

---

**`expose_tools_over_mcp`** `bool = False`

---

```python
class nemo_gym.base_resources_server.BaseRunRequest()
```

**Bases:** `BaseModel`

**`capture_rollout_id`** `Optional[str]`

---

**`model_config`** `= ConfigDict(populate_by_name=True)`

---

**`responses_create_params`** `NeMoGymResponseCreateParamsNonStreaming`

---

```python
class nemo_gym.base_resources_server.BaseSeedSessionRequest()
```

**Bases:** `BaseModel`

```python
class nemo_gym.base_resources_server.BaseSeedSessionResponse()
```

**Bases:** `BaseModel`

```python
class nemo_gym.base_resources_server.BaseVerifyRequest()
```

**Bases:** [BaseRunRequest](#nemo_gym-base_resources_server-BaseRunRequest)

**`response`** `NeMoGymResponse`

---

```python
class nemo_gym.base_resources_server.BaseVerifyResponse()
```

**Bases:** [BaseVerifyRequest](#nemo_gym-base_resources_server-BaseVerifyRequest)

**`failure_kind`** `Optional[str]`

---

**`failure_reason`** `Optional[str] = None`

---

**`mask_sample`** `bool`

---

**`reward`** `float`

---

```python
nemo_gym.base_resources_server.BaseVerifyResponse._warn_on_unregistered_failure_kind(
    value: typing.Optional[str]
) -> typing.Optional[str]
```

classmethod

Producers learn about a name outside the vocabulary without losing the failure.

Validation warns rather than rejects: an unregistered kind is a migration signal,
and dropping the response over it would replace a visible wrong label with an
invisible lost failure.

```python
class nemo_gym.base_resources_server.MCPServerMetadata()
```

**Bases:** `BaseModel`

Metadata returned from /seed\_session for per-rollout Gym MCP access.

**`headers`** `dict[str, str]`

---

**`server_name`** `str`

---

**`transport`** `str = 'http'`

---

**`url_path`** `str = '/mcp'`

---

```python
class nemo_gym.base_resources_server.ResourcesCloseSessionRequest()
```

**Bases:** `BaseModel`

Close resources-server state.

**`episode_id`** `EpisodeId`

---

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

---

**`resources_session_id`** `str`

---

```python
class nemo_gym.base_resources_server.ResourcesCloseSessionResponse()
```

**Bases:** `BaseModel`

Confirm resources-server state was closed.

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

---

**`resources_session_id`** `str`

---

```python
class nemo_gym.base_resources_server.ResourcesSeedSessionRequest()
```

**Bases:** `BaseModel`

Idempotently initialize resources state under a caller-assigned identifier.

**`episode_id`** `EpisodeId`

---

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

---

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

---

**`task_data`** `dict[str, JsonValue]`

---

**`task_id`** `TaskId`

---

```python
class nemo_gym.base_resources_server.ResourcesSeedSessionResponse()
```

**Bases:** `BaseModel`

Confirm resources state and return optional agent access.

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

---

**`resources_session_id`** `str`

---

**`resources_tools`** `MCPServerMetadata | None = None`

---

**`sandbox_access`** `SandboxAccess | None = None`

---

```python
class nemo_gym.base_resources_server.ResourcesVerifyRequest()
```

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

Carry typed environment output to a resources server.

**`episode_id`** `EpisodeId`

---

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

---

**`task_id`** `TaskId`

---

**`verification_input`** `VerificationInputT`

---

```python
class nemo_gym.base_resources_server.ReverifyMode
```

**Bases:** `enum.Enum`

**`STATELESS`** `= 'stateless'`

---

**`UNKNOWN`** `= 'unknown'`

---

**`UNSUPPORTED`** `= 'unsupported'`

---

```python
class nemo_gym.base_resources_server.SimpleResourcesServer()
```

**Bases:** [BaseResourcesServer](#nemo_gym-base_resources_server-BaseResourcesServer), [AggregateMetricsMixin](/nemo/gym/nemo-gym/nemo_gym/reward_profile#nemo_gym-reward_profile-AggregateMetricsMixin), [SimpleServer](/nemo/gym/nemo-gym/nemo_gym/server_utils#nemo_gym-server_utils-SimpleServer)

**`config`** `BaseResourcesServerConfig`

---

```python
nemo_gym.base_resources_server.SimpleResourcesServer.aggregate_metrics(
    body: nemo_gym.config_types.AggregateMetricsRequest
) -> nemo_gym.config_types.AggregateMetrics
```

async

Compute aggregate metrics from verify responses.

RewardProfiler provides baseline stats. Override compute\_metrics(),
compute\_repeat\_metrics(), and/or get\_key\_metrics() for benchmark-specific customization.

```python
nemo_gym.base_resources_server.SimpleResourcesServer.close_resources_session(
    body: nemo_gym.base_resources_server.ResourcesCloseSessionRequest
) -> nemo_gym.base_resources_server.ResourcesCloseSessionResponse
```

async

Close state an Environment Server seeded; the default keeps none.

Served at `/close_session`. Servers that keep per-rollout state override this method, and may accept
other close bodies by overriding it with a different signature. The name differs from the
`close_session` helpers some servers already define for their own state.

```python
nemo_gym.base_resources_server.SimpleResourcesServer.get_reverify_mode() -> nemo_gym.base_resources_server.ReverifyMode
```

async

```python
nemo_gym.base_resources_server.SimpleResourcesServer.mcp_allowed_tools_for_session(
    seed_body: dict[str, typing.Any]
) -> typing.Optional[list[str]]
```

Per-session tool restriction: return the tool names allowed for this rollout's MCP token,
or `None` (the default) for unrestricted. `seed_body` is the JSON body POSTed to
`/seed_session`, or its `task_data` when an Environment Server seeds the session.

```python
nemo_gym.base_resources_server.SimpleResourcesServer.mcp_tools(
    harvested: list[nemo_gym.mcp_auto_exposure.MCPTool],
    catchall: typing.Optional[typing.Any]
) -> typing.Optional[list[nemo_gym.mcp_auto_exposure.MCPTool]]
```

Return the MCP tools to expose (default: the auto-harvested typed POST routes).

Override to exclude (filter harvested), add catch-all-backed tools (harvested + \[catchall.tool(...)]),
or disable (return None). 'catchall' is None unless the server has one parameterized catch-all route.

```python
nemo_gym.base_resources_server.SimpleResourcesServer.normalize_tool_name(
    name: str
) -> str
```

Strip this server's MCP namespace from a trajectory tool-call name (see module function).

```python
nemo_gym.base_resources_server.SimpleResourcesServer.seed_session(
    body: nemo_gym.base_resources_server.ResourcesSeedSessionRequest | nemo_gym.base_resources_server.BaseSeedSessionRequest
) -> nemo_gym.base_resources_server.ResourcesSeedSessionResponse | nemo_gym.base_resources_server.BaseSeedSessionResponse
```

async

Seed per-rollout state; the default keeps none.

An Environment Server seeds with a `ResourcesSeedSessionRequest` and gets its caller-assigned
`resources_session_id` back. An Agent's `/run` seeds with its legacy body and gets an empty
response. Servers that keep per-rollout state override this method.

```python
nemo_gym.base_resources_server.SimpleResourcesServer.setup_webserver() -> fastapi.FastAPI
```

```python
nemo_gym.base_resources_server.SimpleResourcesServer.verify(
    body: nemo_gym.base_resources_server.BaseVerifyRequest
) -> nemo_gym.base_resources_server.BaseVerifyResponse
```

async

abstract

```python
nemo_gym.base_resources_server.normalize_tool_name(
    name: str,
    server_name: typing.Optional[str] = None
) -> str
```

Map a trajectory tool-call name to the server's bare tool name.

HTTP-driven agents record bare tool names ("email\_reply\_email"); MCP-native agents (e.g.
Claude Code) record them namespaced per server ("mcp\_\_workplace\_assistant\_\_email\_reply\_email").
Verifiers compare trajectory names against dataset/ground-truth vocabulary, so names are
normalized before verify sees them and rollouts score identically on both transports.
Non-namespaced names pass through unchanged. When `server_name` is given, only that server's
prefix is stripped (robust to tool names that themselves contain double underscores).
This runs only for servers exposed over MCP and mirrors how MCP clients namespace tool names,
so a real tool that is itself named `mcp__&lt;server&gt;__x` being stripped is accepted.

```python
nemo_gym.base_resources_server.NEMO_GYM_MCP_METADATA_KEY = 'mcp'
```

```python
nemo_gym.base_resources_server.NEMO_GYM_MCP_SESSION_TOKEN_HEADER = 'X-NeMo-Gym-Session-Token'
```

```python
nemo_gym.base_resources_server.RESERVED_MCP_TOOL_NAMES = frozenset({'verify', 'seed_session', 'close_session', 'aggregate_metrics', 'mcp'...
```

```python
nemo_gym.base_resources_server.VerificationInputT = TypeVar('VerificationInputT')
```

```python
nemo_gym.base_resources_server._MCP_TOKEN_SALT = 'nemo-gym-mcp-session-token'
```