From b73f6d6804033da796051c7789396d509aa5b8f1 Mon Sep 17 00:00:00 2001 From: lipikaramaswamy Date: Wed, 1 Jul 2026 16:28:28 -0700 Subject: [PATCH 1/5] feat: expose Data Designer run config --- src/anonymizer/interface/anonymizer.py | 8 +++++ tests/interface/test_anonymizer_interface.py | 32 ++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/anonymizer/interface/anonymizer.py b/src/anonymizer/interface/anonymizer.py index ba9af8d1..bcfee0c5 100644 --- a/src/anonymizer/interface/anonymizer.py +++ b/src/anonymizer/interface/anonymizer.py @@ -13,6 +13,7 @@ from typing import TYPE_CHECKING from data_designer.config.models import ModelProvider +from data_designer.config.run_config import RunConfig from data_designer.config.utils.io_helpers import load_config_file from data_designer.interface.data_designer import DataDesigner @@ -109,6 +110,7 @@ def __init__( model_providers: list[ModelProvider] | str | Path | None = None, artifact_path: str | Path | None = None, data_designer: DataDesigner | None = None, + data_designer_run_config: RunConfig | None = None, detection_workflow: EntityDetectionWorkflow | None = None, replace_runner: ReplacementWorkflow | None = None, rewrite_runner: RewriteWorkflow | None = None, @@ -125,6 +127,10 @@ def __init__( artifact_path: Directory for intermediate artifacts. Defaults to ``.anonymizer-artifacts``. data_designer: Pre-configured DataDesigner instance (advanced usage). + data_designer_run_config: Optional DataDesigner run configuration + applied to the Anonymizer-managed or caller-supplied DataDesigner + instance. Use this for DataDesigner execution knobs such as + ``buffer_size`` and ``max_in_flight_tasks``. detection_workflow: Custom detection workflow (advanced/testing). replace_runner: Custom replacement workflow (advanced/testing). rewrite_runner: Custom rewrite workflow (advanced/testing). @@ -164,6 +170,8 @@ def __init__( model_providers=self._resolved_providers, ) reapply_log_levels() + if data_designer_run_config is not None: + self._data_designer.set_run_config(data_designer_run_config) self._adapter = NddAdapter(data_designer=self._data_designer) self._detection_workflow = detection_workflow or EntityDetectionWorkflow(adapter=self._adapter) self._replace_runner = replace_runner or ReplacementWorkflow( diff --git a/tests/interface/test_anonymizer_interface.py b/tests/interface/test_anonymizer_interface.py index 289c4c74..e1dbb1d7 100644 --- a/tests/interface/test_anonymizer_interface.py +++ b/tests/interface/test_anonymizer_interface.py @@ -10,6 +10,7 @@ import pandas as pd import pytest from data_designer.config.models import ModelConfig +from data_designer.config.run_config import RunConfig from anonymizer.config.anonymizer_config import AnonymizerConfig, AnonymizerInput, Rewrite from anonymizer.config.models import ModelSelection, ReplaceModelSelection @@ -169,6 +170,37 @@ def test_anonymizer_custom_model_providers_override_bundled_defaults() -> None: assert passed_providers is custom_providers +def test_anonymizer_applies_data_designer_run_config_to_managed_instance() -> None: + run_config = RunConfig(buffer_size=20, max_in_flight_tasks=64) + + with patch("anonymizer.interface.anonymizer.DataDesigner") as mock_data_designer: + Anonymizer( + data_designer_run_config=run_config, + detection_workflow=Mock(), + replace_runner=Mock(), + rewrite_runner=Mock(), + ) + + mock_data_designer.return_value.set_run_config.assert_called_once_with(run_config) + + +def test_anonymizer_applies_data_designer_run_config_to_supplied_instance() -> None: + from data_designer.interface.data_designer import DataDesigner + + data_designer = Mock(spec=DataDesigner) + run_config = RunConfig(buffer_size=20, max_in_flight_tasks=64) + + Anonymizer( + data_designer=data_designer, + data_designer_run_config=run_config, + detection_workflow=Mock(), + replace_runner=Mock(), + rewrite_runner=Mock(), + ) + + data_designer.set_run_config.assert_called_once_with(run_config) + + def test_anonymizer_rejects_missing_provider_as_invalid_config_error() -> None: yaml_str = """ model_configs: From ffe2ca20c3dde21f48201d538d4647161dad3733 Mon Sep 17 00:00:00 2001 From: lipikaramaswamy Date: Tue, 7 Jul 2026 19:31:41 -0700 Subject: [PATCH 2/5] feat: export run config Signed-off-by: lipikaramaswamy --- src/anonymizer/__init__.py | 2 ++ tests/interface/test_anonymizer_interface.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/anonymizer/__init__.py b/src/anonymizer/__init__.py index 64932ab3..4a63168a 100644 --- a/src/anonymizer/__init__.py +++ b/src/anonymizer/__init__.py @@ -9,6 +9,7 @@ __version__ = version("nemo-anonymizer") from data_designer.config.models import ModelProvider as ModelProvider +from data_designer.config.run_config import RunConfig as RunConfig from anonymizer.config.anonymizer_config import ( AnonymizerConfig, @@ -64,6 +65,7 @@ def __getattr__(name: str) -> object: "Redact", "Rewrite", "RiskTolerance", + "RunConfig", "Substitute", "configure_logging", ] diff --git a/tests/interface/test_anonymizer_interface.py b/tests/interface/test_anonymizer_interface.py index e1dbb1d7..f307a609 100644 --- a/tests/interface/test_anonymizer_interface.py +++ b/tests/interface/test_anonymizer_interface.py @@ -10,8 +10,8 @@ import pandas as pd import pytest from data_designer.config.models import ModelConfig -from data_designer.config.run_config import RunConfig +from anonymizer import RunConfig from anonymizer.config.anonymizer_config import AnonymizerConfig, AnonymizerInput, Rewrite from anonymizer.config.models import ModelSelection, ReplaceModelSelection from anonymizer.config.replace_strategies import Redact, Substitute From bae3b0f00688deee3d8d36fd90ab20e7099672a6 Mon Sep 17 00:00:00 2001 From: lipikaramaswamy Date: Tue, 7 Jul 2026 19:35:45 -0700 Subject: [PATCH 3/5] refactor: defer run config type import Signed-off-by: lipikaramaswamy --- src/anonymizer/interface/anonymizer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/anonymizer/interface/anonymizer.py b/src/anonymizer/interface/anonymizer.py index bcfee0c5..09f82b46 100644 --- a/src/anonymizer/interface/anonymizer.py +++ b/src/anonymizer/interface/anonymizer.py @@ -13,7 +13,6 @@ from typing import TYPE_CHECKING from data_designer.config.models import ModelProvider -from data_designer.config.run_config import RunConfig from data_designer.config.utils.io_helpers import load_config_file from data_designer.interface.data_designer import DataDesigner @@ -87,6 +86,7 @@ if TYPE_CHECKING: import pandas as pd from data_designer.config.config_builder import DataDesignerConfigBuilder + from data_designer.config.run_config import RunConfig logger = logging.getLogger("anonymizer") From 8f0843130552e5f1db51302ffe3fcf72bf1a1a6a Mon Sep 17 00:00:00 2001 From: Lipika Ramaswamy Date: Fri, 10 Jul 2026 12:22:00 -0700 Subject: [PATCH 4/5] test: keep run config annotation resolvable Signed-off-by: Lipika Ramaswamy --- src/anonymizer/interface/anonymizer.py | 2 +- tests/interface/test_anonymizer_interface.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/anonymizer/interface/anonymizer.py b/src/anonymizer/interface/anonymizer.py index 09f82b46..bcfee0c5 100644 --- a/src/anonymizer/interface/anonymizer.py +++ b/src/anonymizer/interface/anonymizer.py @@ -13,6 +13,7 @@ from typing import TYPE_CHECKING from data_designer.config.models import ModelProvider +from data_designer.config.run_config import RunConfig from data_designer.config.utils.io_helpers import load_config_file from data_designer.interface.data_designer import DataDesigner @@ -86,7 +87,6 @@ if TYPE_CHECKING: import pandas as pd from data_designer.config.config_builder import DataDesignerConfigBuilder - from data_designer.config.run_config import RunConfig logger = logging.getLogger("anonymizer") diff --git a/tests/interface/test_anonymizer_interface.py b/tests/interface/test_anonymizer_interface.py index f307a609..766fb48b 100644 --- a/tests/interface/test_anonymizer_interface.py +++ b/tests/interface/test_anonymizer_interface.py @@ -5,6 +5,7 @@ from pathlib import Path from types import SimpleNamespace +from typing import get_type_hints from unittest.mock import Mock, patch import pandas as pd @@ -201,6 +202,12 @@ def test_anonymizer_applies_data_designer_run_config_to_supplied_instance() -> N data_designer.set_run_config.assert_called_once_with(run_config) +def test_anonymizer_init_type_hints_resolve_run_config() -> None: + hints = get_type_hints(Anonymizer.__init__) + + assert hints["data_designer_run_config"] == RunConfig | None + + def test_anonymizer_rejects_missing_provider_as_invalid_config_error() -> None: yaml_str = """ model_configs: From bec659caf32a2836fddb9144e826438d08844f8b Mon Sep 17 00:00:00 2001 From: Lipika Ramaswamy Date: Fri, 10 Jul 2026 12:29:09 -0700 Subject: [PATCH 5/5] test: remove run config type hint assertion Signed-off-by: Lipika Ramaswamy --- tests/interface/test_anonymizer_interface.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tests/interface/test_anonymizer_interface.py b/tests/interface/test_anonymizer_interface.py index 766fb48b..f307a609 100644 --- a/tests/interface/test_anonymizer_interface.py +++ b/tests/interface/test_anonymizer_interface.py @@ -5,7 +5,6 @@ from pathlib import Path from types import SimpleNamespace -from typing import get_type_hints from unittest.mock import Mock, patch import pandas as pd @@ -202,12 +201,6 @@ def test_anonymizer_applies_data_designer_run_config_to_supplied_instance() -> N data_designer.set_run_config.assert_called_once_with(run_config) -def test_anonymizer_init_type_hints_resolve_run_config() -> None: - hints = get_type_hints(Anonymizer.__init__) - - assert hints["data_designer_run_config"] == RunConfig | None - - def test_anonymizer_rejects_missing_provider_as_invalid_config_error() -> None: yaml_str = """ model_configs: