> This page is for version 0.6.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.composed_backend

Backend-neutral composition of a web browser driver and task evaluator.

## Module Contents

### Classes

| Name                                                                      | Description                                                            |
| ------------------------------------------------------------------------- | ---------------------------------------------------------------------- |
| [`ComposedWebBackend`](#nemo_gym-web-composed_backend-ComposedWebBackend) | Implement the common environment protocol from independent roles.      |
| [`WebBrowserDriver`](#nemo_gym-web-composed_backend-WebBrowserDriver)     | Own the live browser only; model prompting and scoring live elsewhere. |
| [`WebTaskEvaluator`](#nemo_gym-web-composed_backend-WebTaskEvaluator)     | Score a completed task without owning the browser lifecycle.           |

### API

```python
class nemo_gym.web.composed_backend.ComposedWebBackend(
    driver: nemo_gym.web.composed_backend.WebBrowserDriver,
    evaluator: nemo_gym.web.composed_backend.WebTaskEvaluator
)
```

Implement the common environment protocol from independent roles.

The driver owns Chromium/Playwright/PyAutoGUI mechanics. The evaluator
owns benchmark scoring. The agent remains an HTTP client of this backend
and never imports either implementation.

**`_observation`** `WebObservation | None = None`

---

**`_task`** `WebTask | None = None`

---

```python
nemo_gym.web.composed_backend.ComposedWebBackend._require_active() -> tuple[nemo_gym.web.models.WebTask, nemo_gym.web.models.WebObservation]
```

```python
nemo_gym.web.composed_backend.ComposedWebBackend.close() -> None
```

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

```python
nemo_gym.web.composed_backend.ComposedWebBackend.observe() -> nemo_gym.web.models.WebObservation
```

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

```python
nemo_gym.web.composed_backend.ComposedWebBackend.step(
    action: nemo_gym.web.models.WebAction
) -> nemo_gym.web.models.WebStepResult
```

```python
class nemo_gym.web.composed_backend.WebBrowserDriver()
```

Protocol

Own the live browser only; model prompting and scoring live elsewhere.

```python
nemo_gym.web.composed_backend.WebBrowserDriver.close() -> None
```

```python
nemo_gym.web.composed_backend.WebBrowserDriver.evaluation_context() -> typing.Any
```

Return process-local state required by a colocated evaluator.

```python
nemo_gym.web.composed_backend.WebBrowserDriver.observe() -> nemo_gym.web.models.WebObservation
```

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

```python
nemo_gym.web.composed_backend.WebBrowserDriver.step(
    action: nemo_gym.web.models.WebAction
) -> nemo_gym.web.models.WebStepResult
```

```python
class nemo_gym.web.composed_backend.WebTaskEvaluator()
```

Protocol

Score a completed task without owning the browser lifecycle.

```python
nemo_gym.web.composed_backend.WebTaskEvaluator.close() -> None
```

```python
nemo_gym.web.composed_backend.WebTaskEvaluator.evaluate(
    task: nemo_gym.web.models.WebTask,
    observation: nemo_gym.web.models.WebObservation,
    final_answer: str | None,
    browser_context: typing.Any
) -> nemo_gym.web.models.WebVerifierResult
```

```python
nemo_gym.web.composed_backend.WebTaskEvaluator.prepare(
    task: nemo_gym.web.models.WebTask,
    observation: nemo_gym.web.models.WebObservation,
    browser_context: typing.Any
) -> None
```

Capture evaluator state required before the policy starts acting.