From 27eed95672f37d3366cc132bfd691d76fb18aac6 Mon Sep 17 00:00:00 2001 From: Wojciech Prazuch Date: Wed, 24 Jun 2026 09:21:32 +0200 Subject: [PATCH 1/6] feat(config): unify dataset source via discriminated source: block Replace the parallel gitlab_identifier / huggingface_identifier fields on DatasetConfig with a single self-describing source: block (type selects the backend). Legacy fields keep working: a legacy identifier is mirrored into source (with a DeprecationWarning), and a source: is back-filled into the matching legacy field so existing consumers that read the *_identifier fields are unaffected. Specifying both is rejected. Addresses FEP-1025 (reduce configuration friction, epic #1205). Signed-off-by: Wojciech Prazuch --- nemo_gym/config_types.py | 76 +++++++++++++- tests/unit_tests/test_dataset_source.py | 117 ++++++++++++++++++++++ tests/unit_tests/test_train_data_utils.py | 1 + 3 files changed, 193 insertions(+), 1 deletion(-) create mode 100644 tests/unit_tests/test_dataset_source.py diff --git a/nemo_gym/config_types.py b/nemo_gym/config_types.py index 75e9b59f54..123f56e05a 100644 --- a/nemo_gym/config_types.py +++ b/nemo_gym/config_types.py @@ -12,10 +12,11 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +import warnings from argparse import ArgumentParser from enum import Enum from pathlib import Path -from typing import Any, ClassVar, Dict, List, Literal, Optional, Set, Tuple, Union +from typing import Annotated, Any, ClassVar, Dict, List, Literal, Optional, Set, Tuple, Union import rich from omegaconf import DictConfig, OmegaConf @@ -366,12 +367,37 @@ def check_output_path(self) -> "DownloadJsonlDatasetHuggingFaceConfig": DatasetType = Union[Literal["train"], Literal["validation"], Literal["example"]] +class GitlabDatasetSource(BaseModel): + """Unified ``source:`` for a dataset fetched from the GitLab model registry.""" + + type: Literal["gitlab"] + dataset_name: str + version: str + artifact_fpath: str + + +class HuggingFaceDatasetSource(BaseModel): + """Unified ``source:`` for a dataset fetched from the HuggingFace Hub.""" + + type: Literal["huggingface"] + repo_id: str + artifact_fpath: Optional[str] = None + + +# One discriminated `source:` block replaces the parallel gitlab_identifier / huggingface_identifier +# fields; `type` selects the backend so it's unambiguous which fields apply. +DatasetSource = Annotated[Union[GitlabDatasetSource, HuggingFaceDatasetSource], Field(discriminator="type")] + + class DatasetConfig(BaseModel): name: str type: DatasetType jsonl_fpath: str num_repeats: int = Field(default=1, ge=1) + # Unified, self-describing dataset source. Prefer this over the legacy *_identifier fields below. + source: Optional[DatasetSource] = None + # Deprecated: kept working (and back-filled from/into `source`) for backward compatibility. gitlab_identifier: Optional[JsonlDatasetGitlabIdentifer] = None huggingface_identifier: Optional[JsonlDatasetHuggingFaceIdentifer] = None license: Optional[ @@ -394,6 +420,54 @@ def check_train_validation_sets(self) -> "DatasetConfig": return self + @model_validator(mode="after") + def normalize_dataset_source(self) -> "DatasetConfig": + """Reconcile the unified `source:` with the legacy `*_identifier` fields. + + Exactly one source may be specified. A legacy identifier is accepted (with a deprecation + warning) and mirrored into `source`; conversely a `source:` is mirrored back into the + matching legacy field so existing consumers that read `gitlab_identifier`/ + `huggingface_identifier` keep working. + """ + specified = [ + name + for name, value in ( + ("source", self.source), + ("gitlab_identifier", self.gitlab_identifier), + ("huggingface_identifier", self.huggingface_identifier), + ) + if value is not None + ] + if len(specified) > 1: + raise ValueError( + f"Specify a dataset source once for '{self.name}': set only one of {specified}. " + "Prefer the unified `source:` block." + ) + if not specified: + return self + + if self.source is None: + # Legacy identifier was used: mirror it into `source` and nudge toward the new field. + if self.gitlab_identifier is not None: + self.source = GitlabDatasetSource(type="gitlab", **self.gitlab_identifier.model_dump()) + else: + self.source = HuggingFaceDatasetSource(type="huggingface", **self.huggingface_identifier.model_dump()) + warnings.warn( + f"`{specified[0]}` is deprecated for dataset '{self.name}'; use the unified " + f"`source:` block (type: {self.source.type}).", + DeprecationWarning, + stacklevel=2, + ) + else: + # `source:` was used: back-fill the matching legacy field for existing consumers. + fields = self.source.model_dump(exclude={"type"}) + if isinstance(self.source, GitlabDatasetSource): + self.gitlab_identifier = JsonlDatasetGitlabIdentifer(**fields) + else: + self.huggingface_identifier = JsonlDatasetHuggingFaceIdentifer(**fields) + + return self + class BenchmarkDatasetConfig(BaseModel): name: str diff --git a/tests/unit_tests/test_dataset_source.py b/tests/unit_tests/test_dataset_source.py new file mode 100644 index 0000000000..7f4a208b43 --- /dev/null +++ b/tests/unit_tests/test_dataset_source.py @@ -0,0 +1,117 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from pydantic import ValidationError +from pytest import raises, warns + +from nemo_gym.config_types import ( + DatasetConfig, + GitlabDatasetSource, + HuggingFaceDatasetSource, +) + + +def _dataset(**extra) -> dict: + return {"name": "ds", "type": "example", "jsonl_fpath": "data.jsonl", **extra} + + +class TestDatasetSource: + def test_source_gitlab_backfills_legacy_identifier(self) -> None: + cfg = DatasetConfig.model_validate( + _dataset( + source={ + "type": "gitlab", + "dataset_name": "my_dataset", + "version": "0.0.1", + "artifact_fpath": "train.jsonl", + } + ) + ) + + assert isinstance(cfg.source, GitlabDatasetSource) + # Existing consumers read the legacy field; it must be back-filled from `source`. + assert cfg.gitlab_identifier is not None + assert cfg.gitlab_identifier.dataset_name == "my_dataset" + assert cfg.gitlab_identifier.version == "0.0.1" + assert cfg.gitlab_identifier.artifact_fpath == "train.jsonl" + assert cfg.huggingface_identifier is None + + def test_source_huggingface_backfills_legacy_identifier(self) -> None: + cfg = DatasetConfig.model_validate( + _dataset(source={"type": "huggingface", "repo_id": "org/dataset", "artifact_fpath": "train.jsonl"}) + ) + + assert isinstance(cfg.source, HuggingFaceDatasetSource) + assert cfg.huggingface_identifier is not None + assert cfg.huggingface_identifier.repo_id == "org/dataset" + assert cfg.huggingface_identifier.artifact_fpath == "train.jsonl" + assert cfg.gitlab_identifier is None + + def test_legacy_gitlab_identifier_mirrors_into_source_with_warning(self) -> None: + with warns(DeprecationWarning, match="gitlab_identifier"): + cfg = DatasetConfig.model_validate( + _dataset( + gitlab_identifier={ + "dataset_name": "my_dataset", + "version": "0.0.1", + "artifact_fpath": "train.jsonl", + } + ) + ) + + assert isinstance(cfg.source, GitlabDatasetSource) + assert cfg.source.dataset_name == "my_dataset" + assert cfg.source.version == "0.0.1" + assert cfg.source.artifact_fpath == "train.jsonl" + # Legacy field stays populated so nothing that already reads it breaks. + assert cfg.gitlab_identifier is not None + + def test_legacy_huggingface_identifier_mirrors_into_source_with_warning(self) -> None: + with warns(DeprecationWarning, match="huggingface_identifier"): + cfg = DatasetConfig.model_validate(_dataset(huggingface_identifier={"repo_id": "org/dataset"})) + + assert isinstance(cfg.source, HuggingFaceDatasetSource) + assert cfg.source.repo_id == "org/dataset" + assert cfg.source.artifact_fpath is None + assert cfg.huggingface_identifier is not None + + def test_specifying_source_and_legacy_identifier_is_rejected(self) -> None: + with raises(ValidationError, match="set only one"): + DatasetConfig.model_validate( + _dataset( + source={ + "type": "gitlab", + "dataset_name": "my_dataset", + "version": "0.0.1", + "artifact_fpath": "train.jsonl", + }, + gitlab_identifier={ + "dataset_name": "my_dataset", + "version": "0.0.1", + "artifact_fpath": "train.jsonl", + }, + ) + ) + + def test_no_source_is_allowed(self) -> None: + cfg = DatasetConfig.model_validate(_dataset()) + + assert cfg.source is None + assert cfg.gitlab_identifier is None + assert cfg.huggingface_identifier is None + + def test_source_discriminator_selects_backend(self) -> None: + with raises(ValidationError): + # Missing repo_id for the huggingface branch. + DatasetConfig.model_validate(_dataset(source={"type": "huggingface", "artifact_fpath": "train.jsonl"})) diff --git a/tests/unit_tests/test_train_data_utils.py b/tests/unit_tests/test_train_data_utils.py index 0e57463c23..31ada07687 100644 --- a/tests/unit_tests/test_train_data_utils.py +++ b/tests/unit_tests/test_train_data_utils.py @@ -125,6 +125,7 @@ def test_load_and_validate_server_instance_configs_sanity(self, monkeypatch: Mon "type": "example", "jsonl_fpath": "resources_servers/example_multi_step/data/example.jsonl", "num_repeats": 1, + "source": None, "gitlab_identifier": None, "huggingface_identifier": None, "license": None, From d5b24c43a8a4fde7008db22ca31a989c05aa0ebb Mon Sep 17 00:00:00 2001 From: Wojciech Prazuch Date: Wed, 24 Jun 2026 10:15:35 +0200 Subject: [PATCH 2/6] feat(cli): inline field docs in generated resources-server config (M6a) (#1638) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## What Generated resources-server configs (`ng_init_resources_server`) now carry inline comments explaining each non-obvious field — `domain`, `resources_server`, the `policy_model` magic name, and the `datasets`/`source:` block — so new users understand the scaffold without leaving the file. Addresses friction #7 (no inline documentation in generated configs). While here, the scaffold now emits the canonical `source:` dataset block instead of the deprecated `gitlab_identifier`, so a freshly created server starts on the recommended schema (depends on #1637). ## Notes - Chose inline comments over an indirected `FIELD_DOCS` constant (suggested in the RFC): there is a single generation site, so a one-line-per-field constant would add indirection without reuse. Easy to extract later if a second site appears. ## Tests - Extended `test_init_resources_server_includes_domain` to assert the generated config (a) contains the inline docs, (b) uses `source: {type: gitlab}` rather than `gitlab_identifier`, and (c) validates cleanly with no `DeprecationWarning`. Part of the configuration-friction epic (#1205), milestone M6a. Targets `wprazuch/dataset-source` since it builds on the `source:` schema; will retarget to the shared base once that merges. Signed-off-by: Wojciech Prazuch --- nemo_gym/cli/env.py | 2 +- tests/unit_tests/test_cli.py | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/nemo_gym/cli/env.py b/nemo_gym/cli/env.py index 2e9f18a233..3fe9e25525 100644 --- a/nemo_gym/cli/env.py +++ b/nemo_gym/cli/env.py @@ -745,7 +745,7 @@ def init_resources_server(): # pragma: no cover jsonl_fpath: resources_servers/{server_type_name}/data/train.jsonl # local data file for this split num_repeats: 1 # times to repeat each example (e.g. for pass@k / mean@k) license: Apache 2.0 # required for train/validation; must be an allowed license string - # to fetch this split from a registry instead, add gitlab_identifier: or huggingface_identifier: + # to fetch this split from a registry instead, add a source: block (type: gitlab | huggingface) - name: validation type: validation jsonl_fpath: resources_servers/{server_type_name}/data/validation.jsonl diff --git a/tests/unit_tests/test_cli.py b/tests/unit_tests/test_cli.py index 8e3d7edd7d..6c9ec1e7f5 100644 --- a/tests/unit_tests/test_cli.py +++ b/tests/unit_tests/test_cli.py @@ -152,6 +152,12 @@ def test_init_resources_server_includes_domain(self) -> None: # This should not raise an assertion error about missing domain instance_config = ResourcesServerInstanceConfig.model_validate(full_config_dict) assert instance_config is not None + + # The generated config points users at the unified `source:` identifier, not the + # deprecated gitlab_identifier/huggingface_identifier. + assert "source:" in config_text + assert "gitlab_identifier" not in config_text + assert "huggingface_identifier" not in config_text finally: # Clean up the test server directory if server_path.exists(): From 6253a8ad08dc86fca420565637c6d83f3bd6002d Mon Sep 17 00:00:00 2001 From: Wojciech Prazuch Date: Wed, 24 Jun 2026 13:26:15 +0200 Subject: [PATCH 3/6] docs(config): demonstrate the unified source: syntax in example_multi_step Rewrite the example_multi_step datasets from the deprecated gitlab_identifier: blocks to the new unified source: block (type: gitlab), with an inline comment showing the huggingface form. Serves as a worked example of the new dataset-source syntax. Verified end to end: ng_dump_config merges the config, and each dataset validates via DatasetConfig (source: parsed, legacy gitlab_identifier back-filled so existing consumers keep working). Signed-off-by: Wojciech Prazuch --- .../configs/example_multi_step.yaml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/resources_servers/example_multi_step/configs/example_multi_step.yaml b/resources_servers/example_multi_step/configs/example_multi_step.yaml index a28ca1b67e..a228610d9d 100644 --- a/resources_servers/example_multi_step/configs/example_multi_step.yaml +++ b/resources_servers/example_multi_step/configs/example_multi_step.yaml @@ -19,7 +19,11 @@ example_multi_step_simple_agent: - name: train type: train jsonl_fpath: resources_servers/example_multi_step/data/train.jsonl - gitlab_identifier: + # Unified dataset source. `type` selects the backend (gitlab | huggingface); the remaining + # fields are backend-specific. This replaces the deprecated gitlab_identifier:/ + # huggingface_identifier: blocks (which still work but are no longer recommended). + source: + type: gitlab dataset_name: example_multi_step version: 0.0.1 artifact_fpath: train.jsonl @@ -27,10 +31,16 @@ example_multi_step_simple_agent: - name: validation type: validation jsonl_fpath: resources_servers/example_multi_step/data/validation.jsonl - gitlab_identifier: + source: + type: gitlab dataset_name: example_multi_step version: 0.0.1 artifact_fpath: validation.jsonl + # A HuggingFace-hosted split would instead look like: + # source: + # type: huggingface + # repo_id: nvidia/example_multi_step + # artifact_fpath: validation.jsonl # optional license: Apache 2.0 - name: example type: example From b76ac6c896c5eca63fd9e07eba5fcce0f4dc9626 Mon Sep 17 00:00:00 2001 From: Wojciech Prazuch Date: Wed, 24 Jun 2026 13:34:31 +0200 Subject: [PATCH 4/6] fix(config): allow both legacy dataset identifiers; add huggingface source: example The unified source: validator wrongly rejected datasets that set both gitlab_identifier and huggingface_identifier together. That combo is a supported gitlab-primary / huggingface-fallback pair (backend chosen at download time via config.data_source, see train_data_utils.py), and existing configs such as mcqa rely on it. Make source: mutually exclusive with the legacy identifiers only; keep two legacy identifiers together valid (source: left unset since the single discriminated block cannot represent both). Add a regression test. Also rewrite the mcqa validation dataset to the new source: {type: huggingface} block as a worked huggingface example. Verified end to end: ng_dump_config merges the config and every mcqa dataset validates via DatasetConfig (train keeps both legacy fields, validation back-fills huggingface_identifier from source:). Signed-off-by: Wojciech Prazuch --- nemo_gym/config_types.py | 54 ++++++++++++++---------- resources_servers/mcqa/configs/mcqa.yaml | 5 ++- tests/unit_tests/test_dataset_source.py | 19 +++++++++ 3 files changed, 54 insertions(+), 24 deletions(-) diff --git a/nemo_gym/config_types.py b/nemo_gym/config_types.py index 123f56e05a..48ca775a4c 100644 --- a/nemo_gym/config_types.py +++ b/nemo_gym/config_types.py @@ -424,47 +424,55 @@ def check_train_validation_sets(self) -> "DatasetConfig": def normalize_dataset_source(self) -> "DatasetConfig": """Reconcile the unified `source:` with the legacy `*_identifier` fields. - Exactly one source may be specified. A legacy identifier is accepted (with a deprecation - warning) and mirrored into `source`; conversely a `source:` is mirrored back into the - matching legacy field so existing consumers that read `gitlab_identifier`/ - `huggingface_identifier` keep working. + The unified `source:` block is mutually exclusive with the legacy identifiers. The two + legacy identifiers may still be set together (a gitlab-primary / huggingface-fallback pair + selected at download time by `config.data_source`) for backward compatibility. A legacy + identifier emits a deprecation warning and, when a single backend is given, is mirrored into + `source`; conversely a `source:` is mirrored back into the matching legacy field so existing + consumers that read `gitlab_identifier`/`huggingface_identifier` keep working. """ - specified = [ + legacy_specified = [ name for name, value in ( - ("source", self.source), ("gitlab_identifier", self.gitlab_identifier), ("huggingface_identifier", self.huggingface_identifier), ) if value is not None ] - if len(specified) > 1: + if self.source is not None and legacy_specified: raise ValueError( - f"Specify a dataset source once for '{self.name}': set only one of {specified}. " + f"Specify a dataset source once for '{self.name}': set only one of " + f"['source', {', '.join(repr(name) for name in legacy_specified)}]. " "Prefer the unified `source:` block." ) - if not specified: - return self - if self.source is None: - # Legacy identifier was used: mirror it into `source` and nudge toward the new field. - if self.gitlab_identifier is not None: - self.source = GitlabDatasetSource(type="gitlab", **self.gitlab_identifier.model_dump()) - else: - self.source = HuggingFaceDatasetSource(type="huggingface", **self.huggingface_identifier.model_dump()) - warnings.warn( - f"`{specified[0]}` is deprecated for dataset '{self.name}'; use the unified " - f"`source:` block (type: {self.source.type}).", - DeprecationWarning, - stacklevel=2, - ) - else: + if self.source is not None: # `source:` was used: back-fill the matching legacy field for existing consumers. fields = self.source.model_dump(exclude={"type"}) if isinstance(self.source, GitlabDatasetSource): self.gitlab_identifier = JsonlDatasetGitlabIdentifer(**fields) else: self.huggingface_identifier = JsonlDatasetHuggingFaceIdentifer(**fields) + return self + + if not legacy_specified: + return self + + warnings.warn( + f"{' and '.join(f'`{name}`' for name in legacy_specified)} " + f"{'is' if len(legacy_specified) == 1 else 'are'} deprecated for dataset " + f"'{self.name}'; prefer the unified `source:` block.", + DeprecationWarning, + stacklevel=2, + ) + # Mirror a single legacy identifier into `source`. When both are set (primary + fallback), + # the single discriminated `source:` can't represent both, so leave it unset and keep the + # legacy fields as the source of truth. + if len(legacy_specified) == 1: + if self.gitlab_identifier is not None: + self.source = GitlabDatasetSource(type="gitlab", **self.gitlab_identifier.model_dump()) + else: + self.source = HuggingFaceDatasetSource(type="huggingface", **self.huggingface_identifier.model_dump()) return self diff --git a/resources_servers/mcqa/configs/mcqa.yaml b/resources_servers/mcqa/configs/mcqa.yaml index 0d07dd3bf3..96b390bd26 100644 --- a/resources_servers/mcqa/configs/mcqa.yaml +++ b/resources_servers/mcqa/configs/mcqa.yaml @@ -31,7 +31,10 @@ mcqa_simple_agent: - name: validation type: validation jsonl_fpath: resources_servers/mcqa/data/validation.jsonl - huggingface_identifier: + # Unified dataset source. `type` selects the backend (gitlab | huggingface); here the split + # is pulled from the HuggingFace Hub. `artifact_fpath` is optional for huggingface sources. + source: + type: huggingface repo_id: nvidia/Nemotron-RL-knowledge-mcqa license: Apache 2.0 - name: example diff --git a/tests/unit_tests/test_dataset_source.py b/tests/unit_tests/test_dataset_source.py index 7f4a208b43..da9c7c1387 100644 --- a/tests/unit_tests/test_dataset_source.py +++ b/tests/unit_tests/test_dataset_source.py @@ -104,6 +104,25 @@ def test_specifying_source_and_legacy_identifier_is_rejected(self) -> None: ) ) + def test_both_legacy_identifiers_together_is_allowed(self) -> None: + # A gitlab-primary / huggingface-fallback pair (backend chosen at download time) must stay + # valid; the single discriminated `source:` can't represent both, so it is left unset. + with warns(DeprecationWarning, match="gitlab_identifier"): + cfg = DatasetConfig.model_validate( + _dataset( + gitlab_identifier={ + "dataset_name": "my_dataset", + "version": "0.0.1", + "artifact_fpath": "train.jsonl", + }, + huggingface_identifier={"repo_id": "org/dataset"}, + ) + ) + + assert cfg.source is None + assert cfg.gitlab_identifier is not None + assert cfg.huggingface_identifier is not None + def test_no_source_is_allowed(self) -> None: cfg = DatasetConfig.model_validate(_dataset()) From 78faa2ef08fa710ff5ef86faa97dbe1ae7556629 Mon Sep 17 00:00:00 2001 From: Wojciech Prazuch Date: Thu, 25 Jun 2026 10:03:08 +0200 Subject: [PATCH 5/6] Update resources_servers/mcqa/configs/mcqa.yaml Co-authored-by: Ananth Subramaniam Signed-off-by: Wojciech Prazuch --- resources_servers/mcqa/configs/mcqa.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources_servers/mcqa/configs/mcqa.yaml b/resources_servers/mcqa/configs/mcqa.yaml index 96b390bd26..9800d7912d 100644 --- a/resources_servers/mcqa/configs/mcqa.yaml +++ b/resources_servers/mcqa/configs/mcqa.yaml @@ -31,7 +31,7 @@ mcqa_simple_agent: - name: validation type: validation jsonl_fpath: resources_servers/mcqa/data/validation.jsonl - # Unified dataset source. `type` selects the backend (gitlab | huggingface); here the split + # Unified dataset source. `type` selects the backend; here the split # is pulled from the HuggingFace Hub. `artifact_fpath` is optional for huggingface sources. source: type: huggingface From f96315dafebe47cb151500af78e62c49427e1e2b Mon Sep 17 00:00:00 2001 From: Wojciech Prazuch Date: Thu, 25 Jun 2026 10:07:16 +0200 Subject: [PATCH 6/6] docs(config): drop backend enumeration in source: comments (ananthsub review) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Apply ananthsub's review suggestion to example_multi_step.yaml — don't enumerate '(gitlab | huggingface)' in the inline comment, since it goes stale as backends are added (mirrors the same suggestion already applied to mcqa.yaml via the web UI). Also remediate the missing DCO sign-off on that web-applied suggestion commit, which was committed through GitHub without a Signed-off-by line: I, Wojciech Prazuch , hereby add my Signed-off-by to this commit: b7b0d55f8d9ebebc02e976904ab8b40e15818267 Signed-off-by: Wojciech Prazuch --- .../example_multi_step/configs/example_multi_step.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources_servers/example_multi_step/configs/example_multi_step.yaml b/resources_servers/example_multi_step/configs/example_multi_step.yaml index a228610d9d..470f3fd257 100644 --- a/resources_servers/example_multi_step/configs/example_multi_step.yaml +++ b/resources_servers/example_multi_step/configs/example_multi_step.yaml @@ -19,7 +19,7 @@ example_multi_step_simple_agent: - name: train type: train jsonl_fpath: resources_servers/example_multi_step/data/train.jsonl - # Unified dataset source. `type` selects the backend (gitlab | huggingface); the remaining + # Unified dataset source. `type` selects the backend; the remaining # fields are backend-specific. This replaces the deprecated gitlab_identifier:/ # huggingface_identifier: blocks (which still work but are no longer recommended). source: