nemo_gym.cli.env

View as Markdown

Module Contents

Classes

NameDescription
InitEnvironmentConfig-
ManifestCommandConfig-
PipListConfig-
RunConfigStart NeMo Gym servers for agents, models, and resources.
RunHelper-
TestAllConfigRun tests for all server modules in the project.
TestConfigTest a specific server module by running its pytest suite and optionally validating example data.

Functions

NameDescription
_catalog_payload-
_collect_model_endpointsThe upstream model endpoints named in the resolved config, as (config key, url) pairs.
_command_overridesParse the already-translated local command flags without resolving Gym runtime config.
_delete_server_venv-
_display_list_of_paths-
_endpoint_probe_urlWhat to GET to find out whether base_url is being served.
_format_pct-
_inspect_environmentRender one entry from the unified environment catalog.
_is_dns_failureWhether a requests connection error was a name that does not resolve.
_manifest_entry-
_model_endpoint_timeout_secondsHow long to wait for model endpoints, from config. 0 or a negative value skips the check.
_print_validation_report-
_probe_endpointWhether anything answers at base_url, and if not, whether waiting could help.
_reject_manifest_command_extras-
_resolve_server_dirResolve a relative server dir (e.g. resources_servers/<name>) to an absolute path.
_run_manifest_verifier-
_select_shardDeterministically select this shard’s subset of modules.
_test_single-
_validate_data_single-
_wait_for_model_endpointsWait for every endpoint to answer. Returns the ones that never did.
dump_configDisplay the resolved Hydra configuration for debugging purposes.
init_environmentCreate a manifest-backed environment or benchmark skeleton.
init_resources_serverInitialize a new resources server with template files and directory structure.
list_environmentsList or inspect the manifest and legacy environment/benchmark catalog.
pip_listList packages installed in a server’s virtual environment.
prefetchPre-warm per-server venvs without starting any servers.
publish_environment_manifestRun local publication checks and confirm a workload is cataloged.
runStart NeMo Gym servers for agents, models, and resources.
status-
test-
test_all-
test_environment_manifestExercise a manifest-backed workload’s verifier fixture without starting services.
validateValidate a manifest-backed workload or a legacy Gym config without starting services.

Data

_BASE_URL_KEY_SUFFIX

_DEFAULT_MODEL_ENDPOINT_READINESS_TIMEOUT_SEC

_ENDPOINT_ANSWERING

_ENDPOINT_POLL_INTERVAL_SEC

_ENDPOINT_PROBE_TIMEOUT_SEC

_ENDPOINT_REFUSED

_ENDPOINT_UNRESOLVABLE

_FORCE_KILL_REAP_TIMEOUT_SEC

_GRACEFUL_SHUTDOWN_TIMEOUT_SEC

_MANIFEST_PUBLISH_KEYS

_MANIFEST_TEST_KEYS

_MANIFEST_VALIDATE_KEYS

_MODEL_SERVER_TYPE

API

class nemo_gym.cli.env.InitEnvironmentConfig()

Bases: BaseNeMoGymCLIConfig

higher_is_better
Optional[bool] = None
profile
IntegrationProfile = IntegrationProfile.CUSTOM_GYM_VERIFIER
reuse_verifier
Optional[str] = None
reward_range
Optional[Tuple[float, float]] = None
scaffold_kind
EnvironmentKind
scaffold_name
str
class nemo_gym.cli.env.ManifestCommandConfig()

Bases: BaseNeMoGymCLIConfig

catalog_kind
Optional[EnvironmentKind] = None
manifest_path
Optional[Path] = None
onboarding_name
Optional[str] = None
sync
bool = False
update_expected
bool = False
class nemo_gym.cli.env.PipListConfig()

Bases: RunConfig

format
Optional[str]
outdated
bool
class nemo_gym.cli.env.RunConfig()

Bases: BaseNeMoGymCLIConfig

Start NeMo Gym servers for agents, models, and resources.

Examples:

config_paths="resources_servers/example_single_tool_call/configs/example_single_tool_call.yaml,\
responses_api_models/openai_model/configs/openai_model.yaml"
gym env start "+config_paths=[${config_paths}]"
entrypoint
str
class nemo_gym.cli.env.RunHelper()
_head_server
Server
_head_server_instance
HeadServer
_head_server_thread
Thread
_processes
Dict[str, Popen]
_server_client
ServerClient
_server_instance_display_configs
List[ServerInstanceDisplayConfig]
nemo_gym.cli.env.RunHelper.check_http_server_statuses(
successful_servers: typing.List[str]
) -> typing.List[typing.Tuple[str, nemo_gym.server_utils.ServerStatus]]
nemo_gym.cli.env.RunHelper.display_server_instance_info() -> None
nemo_gym.cli.env.RunHelper.poll() -> None
nemo_gym.cli.env.RunHelper.run_forever() -> None
nemo_gym.cli.env.RunHelper.shutdown() -> None
nemo_gym.cli.env.RunHelper.start(
global_config_dict_parser_config: nemo_gym.global_config.GlobalConfigDictParserConfig
) -> None
nemo_gym.cli.env.RunHelper.wait_for_dry_run_spinup() -> None

Wait for every dry-run process to finish, and fail if any of them did.

A dry run builds each server’s venv and exits, so unlike poll() a finished process is the expected outcome here and only the exit code separates success from failure. The code has to be checked: uv creates the venv before installing into it, so a failed install still leaves an interpreter and an activate script behind. That venv then satisfies skip_venv_if_present on the next run, and the first symptom is an ImportError from a server long after the install that caused it.

nemo_gym.cli.env.RunHelper.wait_for_model_endpoints(
global_config_dict: omegaconf.DictConfig
) -> None

Block until every model endpoint named in the config answers, then return.

Reads the bound from model_endpoint_readiness_timeout_seconds, where 0 skips the check entirely. Raises ConfigError naming the endpoints that never answered and the config key each came from. It raises rather than exits because RunHelper is imported and driven as a library, so the caller decides what an unreachable endpoint means; the CLI entrypoints turn it into an exit.

The servers spawned above are shut down first. They hold ports and have neither a process group nor an atexit handler, and every caller reaches its own shutdown() only after start() returns.

nemo_gym.cli.env.RunHelper.wait_for_spinup() -> None
class nemo_gym.cli.env.TestAllConfig()

Bases: BaseNeMoGymCLIConfig

Run tests for all server modules in the project.

Examples:

gym env test
delete_venvs_after_each_test
bool
fail_on_total_and_test_mismatch
bool
num_shards
int
shard_index
int
class nemo_gym.cli.env.TestConfig()

Bases: RunConfig

Test a specific server module by running its pytest suite and optionally validating example data.

Examples:

gym env test +entrypoint=resources_servers/example_single_tool_call
_dir_path
Path
dir_path
Path
resolved_dir_path
Path

Absolute server dir resolved against the cwd, then the Gym install root.

Use this for filesystem access (reading data, running the suite); use dir_path (the relative entrypoint) for display and example commands shown to the user.

should_validate_data
bool
nemo_gym.cli.env.TestConfig.model_post_init(
context
)
nemo_gym.cli.env._catalog_payload(
entry: nemo_gym.registry.EnvironmentCatalogEntry
) -> typing.Dict[str, object]
nemo_gym.cli.env._collect_model_endpoints(
global_config_dict: omegaconf.DictConfig
) -> typing.List[typing.Tuple[str, str]]

The upstream model endpoints named in the resolved config, as (config key, url) pairs.

wait_for_spinup only polls Gym’s own servers, and the Gym-side model server answers as soon as it starts whether or not anything is behind it, so these are the URLs nothing checks.

base_url is typed Union[str, List[str]] on vllm_model and the local vLLM servers, where the list form spreads load across replicas. The local ones default to an empty list and are filled in after Gym launches vLLM, so an empty list means “not yet” rather than “misconfigured” and is skipped, as is an unset value.

The key travels with the url because the endpoint that fails may be a judge or user model, and a message naming policy_base_url would then be wrong.

nemo_gym.cli.env._command_overrides() -> omegaconf.DictConfig

Parse the already-translated local command flags without resolving Gym runtime config.

nemo_gym.cli.env._delete_server_venv(
dir_path: pathlib.Path,
global_config_dict: omegaconf.DictConfig
) -> None
nemo_gym.cli.env._display_list_of_paths(
paths: typing.List[pathlib.Path]
) -> str
nemo_gym.cli.env._endpoint_probe_url(
base_url: str
) -> str

What to GET to find out whether base_url is being served.

GET /v1/models is part of the OpenAI API, so most endpoints behind a /v1 base URL answer it, but nothing here depends on that: any HTTP response counts as answering, so an endpoint without it replies 404 and still passes. URLs that do not end in /v1 are probed at their root.

nemo_gym.cli.env._format_pct(
count: int,
total: int
) -> str
nemo_gym.cli.env._inspect_environment(
name: str,
entries: typing.Tuple[nemo_gym.registry.EnvironmentCatalogEntry, ...],
global_config_dict: omegaconf.DictConfig
) -> None

Render one entry from the unified environment catalog.

nemo_gym.cli.env._is_dns_failure(
error: BaseException
) -> bool

Whether a requests connection error was a name that does not resolve.

requests reports this as a ConnectionError like any other, with the resolver failure nested inside, so the cause chain has to be walked rather than the class inspected.

nemo_gym.cli.env._manifest_entry(
config: nemo_gym.cli.env.ManifestCommandConfig
) -> typing.Optional[nemo_gym.registry.EnvironmentCatalogEntry]
nemo_gym.cli.env._model_endpoint_timeout_seconds(
global_config_dict: omegaconf.DictConfig
) -> float

How long to wait for model endpoints, from config. 0 or a negative value skips the check.

An unset key falls back to the same default the config parser applies. A value that is not a number is a configuration mistake, so it is reported as one rather than surfacing as a ValueError traceback from float().

nemo_gym.cli.env._print_validation_report(
report: nemo_gym.environment.validation.EnvironmentValidationReport,
json_output: bool
) -> None
nemo_gym.cli.env._probe_endpoint(
base_url: str,
timeout_seconds: float = _ENDPOINT_PROBE_TIMEOUT_SEC
) -> str

Whether anything answers at base_url, and if not, whether waiting could help.

Answering is the bar, not healthy: a 401 or 404 means something is there, and requiring a 200 would reject endpoints that need auth. A completed TLS handshake counts too, even against a certificate this process does not trust, which is why SSLError is checked before ConnectionError it inherits from.

nemo_gym.cli.env._reject_manifest_command_extras(
command_dict: omegaconf.DictConfig,
allowed: frozenset[str]
) -> None
nemo_gym.cli.env._resolve_server_dir(
rel_path: pathlib.Path
) -> pathlib.Path

Resolve a relative server dir (e.g. resources_servers/<name>) to an absolute path.

Searches NEMO_GYM_EXTRA_ROOTS, the current working directory (a user’s local server), then the Gym install root (PARENT_DIR) where built-in servers live in both editable and wheel installs. A directory counts as a server only if it ships an install marker for one of our two venv setups. This lets gym env test find and run built-in (and plugin) servers from any cwd, not just a repo checkout.

nemo_gym.cli.env._run_manifest_verifier(
entry: nemo_gym.registry.EnvironmentCatalogEntry,
update_expected: bool,
validation: nemo_gym.environment.validation.EnvironmentValidationReport | None = None
) -> nemo_gym.environment.onboarding.VerifierReport
nemo_gym.cli.env._select_shard(
dir_paths: typing.List[pathlib.Path],
shard_index: int,
num_shards: int
) -> typing.List[pathlib.Path]

Deterministically select this shard’s subset of modules.

Round-robin (stride) over a sorted list spreads heavy modules across shards more evenly than contiguous chunks, which balances wall-time when the suite is parallelized across CI runners.

nemo_gym.cli.env._test_single(
test_config: nemo_gym.cli.env.TestConfig,
global_config_dict: omegaconf.DictConfig
) -> subprocess.Popen
nemo_gym.cli.env._validate_data_single(
test_config: nemo_gym.cli.env.TestConfig
) -> None
nemo_gym.cli.env._wait_for_model_endpoints(
endpoints: typing.List[typing.Tuple[str, str]],
timeout_seconds: float,
poll_interval_seconds: float = _ENDPOINT_POLL_INTERVAL_SEC,
monotonic = monotonic,
sleep_fn = sleep
) -> typing.List[typing.Tuple[str, str]]

Wait for every endpoint to answer. Returns the ones that never did.

Unresolvable names are reported once and not waited on. Refused connections are waited on, because an inference server can take minutes to load weights and someone who starts thirty seconds early should not have to start over.

nemo_gym.cli.env.dump_config()

Display the resolved Hydra configuration for debugging purposes.

Examples:

gym env resolve "+config_paths=[<config1>,<config2>]"
nemo_gym.cli.env.init_environment() -> None

Create a manifest-backed environment or benchmark skeleton.

nemo_gym.cli.env.init_resources_server()

Initialize a new resources server with template files and directory structure.

Examples:

gym env init --resources-server my_server
nemo_gym.cli.env.list_environments() -> None

List or inspect the manifest and legacy environment/benchmark catalog.

nemo_gym.cli.env.pip_list()

List packages installed in a server’s virtual environment.

nemo_gym.cli.env.prefetch(
global_config_dict_parser_config: typing.Optional[nemo_gym.global_config.GlobalConfigDictParserConfig] = None
)

Pre-warm per-server venvs without starting any servers.

Accepts the same config format as ‘gym env start’. For each server in the config, creates its isolated venv and installs dependencies serially — similar to how RL’s prefetch_venvs.py installs actor venvs at container build time.

No Ray is initialised and no server processes are started. Intended for use in Dockerfile builds so venvs are ready at runtime with no network access needed.

Examples:

# Pre-warm venvs for a specific config
config_paths="responses_api_models/local_vllm_model/configs/local_vllm_model.yaml,\
resources_servers/math/configs/math.yaml"
gym env prefetch "+config_paths=[${config_paths}]"
nemo_gym.cli.env.publish_environment_manifest() -> None

Run local publication checks and confirm a workload is cataloged.

nemo_gym.cli.env.run(
global_config_dict_parser_config: typing.Optional[nemo_gym.global_config.GlobalConfigDictParserConfig] = None
)

Start NeMo Gym servers for agents, models, and resources.

This command reads configuration from YAML files specified via +config_paths and starts all configured servers. The configuration files should define server instances with their entrypoints and settings.

Examples:

# Start servers with specific configs
config_paths="resources_servers/example_single_tool_call/configs/example_single_tool_call.yaml,\
responses_api_models/openai_model/configs/openai_model.yaml"
gym env start "+config_paths=[${config_paths}]"
nemo_gym.cli.env.status()
nemo_gym.cli.env.test()
nemo_gym.cli.env.test_all()
nemo_gym.cli.env.test_environment_manifest() -> None

Exercise a manifest-backed workload’s verifier fixture without starting services.

nemo_gym.cli.env.validate() -> None

Validate a manifest-backed workload or a legacy Gym config without starting services.

nemo_gym.cli.env._BASE_URL_KEY_SUFFIX = 'base_url'
nemo_gym.cli.env._DEFAULT_MODEL_ENDPOINT_READINESS_TIMEOUT_SEC: float = 600.0
nemo_gym.cli.env._ENDPOINT_ANSWERING = 'answering'
nemo_gym.cli.env._ENDPOINT_POLL_INTERVAL_SEC: float = 3.0
nemo_gym.cli.env._ENDPOINT_PROBE_TIMEOUT_SEC: float = 5.0
nemo_gym.cli.env._ENDPOINT_REFUSED = 'refused'
nemo_gym.cli.env._ENDPOINT_UNRESOLVABLE = 'unresolvable'
nemo_gym.cli.env._FORCE_KILL_REAP_TIMEOUT_SEC: int = 2
nemo_gym.cli.env._GRACEFUL_SHUTDOWN_TIMEOUT_SEC: int = 1
nemo_gym.cli.env._MANIFEST_PUBLISH_KEYS = frozenset({'onboarding_name', 'catalog_kind', 'json', 'verbose'})
nemo_gym.cli.env._MANIFEST_TEST_KEYS = frozenset({'onboarding_name', 'catalog_kind', 'update_expected', 'json', 'verbos...
nemo_gym.cli.env._MANIFEST_VALIDATE_KEYS = frozenset({'onboarding_name', 'catalog_kind', 'manifest_path', 'sync', 'json', '...
nemo_gym.cli.env._MODEL_SERVER_TYPE = 'responses_api_models'