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

# nemo_gym.web.browser_instance

One browser session per process, reachable over HTTP.

A headed PyAutoGUI driver acts on its process's X display, so one process can
serve one session at a time. A browser instance is such a process with its own
display: it hosts an unmodified web backend (driver plus evaluator) behind six
endpoints, and the resources server reaches it through `RemoteWebBackend`.
The resources server can then hold as many sessions as it has instances, while
every action still runs through the same driver code as a local session.

The server is single-threaded on purpose: Playwright's synchronous API is
thread-affine, so every backend call runs on the main thread.

## Module Contents

### Classes

| Name                                                                                                | Description                                                         |
| --------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- |
| [`BrowserInstanceUnavailableError`](#nemo_gym-web-browser_instance-BrowserInstanceUnavailableError) | The instance could not be reached or answered outside its protocol. |
| [`RemoteWebBackend`](#nemo_gym-web-browser_instance-RemoteWebBackend)                               | Forward the web backend protocol to one leased browser instance.    |
| [`_Conflict`](#nemo_gym-web-browser_instance-_Conflict)                                             | -                                                                   |
| [`_InstanceState`](#nemo_gym-web-browser_instance-_InstanceState)                                   | -                                                                   |

### Functions

| Name                                                            | Description                                            |
| --------------------------------------------------------------- | ------------------------------------------------------ |
| [`_load`](#nemo_gym-web-browser_instance-_load)                 | -                                                      |
| [`_make_handler`](#nemo_gym-web-browser_instance-_make_handler) | -                                                      |
| [`_object_path`](#nemo_gym-web-browser_instance-_object_path)   | -                                                      |
| [`_watch_parent`](#nemo_gym-web-browser_instance-_watch_parent) | Exit when the pool that spawned this instance is gone. |
| [`main`](#nemo_gym-web-browser_instance-main)                   | -                                                      |
| [`serve`](#nemo_gym-web-browser_instance-serve)                 | -                                                      |

### Data

[`DIRECT`](#nemo_gym-web-browser_instance-DIRECT)

[`LOG`](#nemo_gym-web-browser_instance-LOG)

[`TOKEN_ENV`](#nemo_gym-web-browser_instance-TOKEN_ENV)

[`TOKEN_HEADER`](#nemo_gym-web-browser_instance-TOKEN_HEADER)

[`TRANSPORT`](#nemo_gym-web-browser_instance-TRANSPORT)

### API

```python
class nemo_gym.web.browser_instance.BrowserInstanceUnavailableError()
```

**Bases:** `RuntimeError`

The instance could not be reached or answered outside its protocol.

```python
class nemo_gym.web.browser_instance.RemoteWebBackend(
    handle: nemo_gym.web.browser_session.BrowserSessionHandle,
    config: typing.Any,
    session_id: str,
    backend_factory: str
)
```

Forward the web backend protocol to one leased browser instance.

Calls are synchronous and run on the session's operation-runner thread,
like the local backend they replace. The instance builds the real backend
on `reset` from the factory and configuration named here, so the
resources server and the instance always agree on driver and evaluator.

**`_endpoint`** `= handle.endpoint.rstrip('/')`

---

**`_timeout`**

---

**`_token`** `= str(handle.metadata.get('token') or '')`

---

```python
nemo_gym.web.browser_instance.RemoteWebBackend._call(
    path: str,
    payload: dict[str, typing.Any]
) -> dict[str, typing.Any]
```

```python
nemo_gym.web.browser_instance.RemoteWebBackend.close() -> None
```

```python
nemo_gym.web.browser_instance.RemoteWebBackend.evaluate(
    final_answer: str | None = None
) -> nemo_gym.web.models.WebVerifierResult
```

```python
nemo_gym.web.browser_instance.RemoteWebBackend.observe() -> nemo_gym.web.models.WebObservation
```

```python
nemo_gym.web.browser_instance.RemoteWebBackend.reset(
    task: nemo_gym.web.models.WebTask
) -> tuple[nemo_gym.web.models.WebObservation, dict[str, typing.Any]]
```

```python
nemo_gym.web.browser_instance.RemoteWebBackend.step(
    action: nemo_gym.web.models.WebAction
) -> nemo_gym.web.models.WebStepResult
```

```python
class nemo_gym.web.browser_instance._Conflict()
```

**Bases:** `RuntimeError`

```python
class nemo_gym.web.browser_instance._InstanceState(
    token: str
)
```

**`exit_code`** `int | None = None`

---

**`session_id`** `str | None = None`

---

```python
nemo_gym.web.browser_instance._load(
    path: str
) -> typing.Any
```

```python
nemo_gym.web.browser_instance._make_handler(
    state: nemo_gym.web.browser_instance._InstanceState
) -> type[http.server.BaseHTTPRequestHandler]
```

```python
nemo_gym.web.browser_instance._object_path(
    value: typing.Any
) -> str
```

```python
nemo_gym.web.browser_instance._watch_parent(
    parent_pid: int
) -> None
```

Exit when the pool that spawned this instance is gone.

```python
nemo_gym.web.browser_instance.main(
    argv: list[str] | None = None
) -> int
```

```python
nemo_gym.web.browser_instance.serve(
    host: str,
    port: int,
    token: str,
    parent_pid: int | None = None
) -> int
```

```python
nemo_gym.web.browser_instance.DIRECT = urllib.request.build_opener(urllib.request.ProxyHandler({}))
```

```python
nemo_gym.web.browser_instance.LOG = logging.getLogger('nemo_gym.web.browser_instance')
```

```python
nemo_gym.web.browser_instance.TOKEN_ENV = 'NEMO_GYM_BROWSER_INSTANCE_TOKEN'
```

```python
nemo_gym.web.browser_instance.TOKEN_HEADER = 'X-Browser-Instance-Token'
```

```python
nemo_gym.web.browser_instance.TRANSPORT = 'browser_instance'
```