From 049feb1197fe308fcb459ce69916eec977aeb954 Mon Sep 17 00:00:00 2001 From: Steve Han Date: Mon, 10 Aug 2026 12:14:00 -0400 Subject: [PATCH 1/6] chore(data-designer-retrieval-sdg): bump version to 0.2.0 --- plugins/data-designer-retrieval-sdg/pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/data-designer-retrieval-sdg/pyproject.toml b/plugins/data-designer-retrieval-sdg/pyproject.toml index 91c59ab..bf093b1 100644 --- a/plugins/data-designer-retrieval-sdg/pyproject.toml +++ b/plugins/data-designer-retrieval-sdg/pyproject.toml @@ -3,7 +3,7 @@ [project] name = "data-designer-retrieval-sdg" -version = "0.1.0" +version = "0.2.0" description = "Retriever SDG toolkit: registers the embedding-dedup column generator and document-chunker seed reader, plus a multi-step QA generation pipeline, CLI, and Automodel-compatible data conversion" requires-python = ">=3.10" dependencies = [ diff --git a/uv.lock b/uv.lock index ed4aecd..80b41c9 100644 --- a/uv.lock +++ b/uv.lock @@ -479,7 +479,7 @@ dev = [ [[package]] name = "data-designer-retrieval-sdg" -version = "0.1.0" +version = "0.2.0" source = { editable = "plugins/data-designer-retrieval-sdg" } dependencies = [ { name = "data-designer" }, From b0281c77facb247eeffeff23c9cafa16dace83b4 Mon Sep 17 00:00:00 2001 From: Steve Han Date: Mon, 10 Aug 2026 12:20:47 -0400 Subject: [PATCH 2/6] docs: refresh retrieval SDG plugin version --- docs/plugins/data-designer-retrieval-sdg/index.md | 2 +- docs/plugins/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/plugins/data-designer-retrieval-sdg/index.md b/docs/plugins/data-designer-retrieval-sdg/index.md index 7fad32b..1e005b3 100644 --- a/docs/plugins/data-designer-retrieval-sdg/index.md +++ b/docs/plugins/data-designer-retrieval-sdg/index.md @@ -9,7 +9,7 @@ custom documentation under `plugins/data-designer-retrieval-sdg/docs/` yet. ## Metadata -- Version: `0.1.0` +- Version: `0.2.0` - Entry points: `document-chunker`, `embedding-dedup` ## Installation diff --git a/docs/plugins/index.md b/docs/plugins/index.md index 94ff3c3..3b98208 100644 --- a/docs/plugins/index.md +++ b/docs/plugins/index.md @@ -19,7 +19,7 @@ Browse available Data Designer plugins by what they add to your data generation data-designer-retrieval-sdg - v0.1.0 + v0.2.0 Retriever SDG toolkit: registers the embedding-dedup column generator and document-chunker seed reader, plus a multi-step QA generation pipeline, CLI, and Automodel-compatible data conversion From b68e51012167eaeef08b6dc8a90941520afbff80 Mon Sep 17 00:00:00 2001 From: Steve Han Date: Mon, 10 Aug 2026 13:01:17 -0400 Subject: [PATCH 3/6] fix(retrieval-sdg): publish security dependency floors --- plugins/data-designer-retrieval-sdg/pyproject.toml | 4 ++++ uv.lock | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/plugins/data-designer-retrieval-sdg/pyproject.toml b/plugins/data-designer-retrieval-sdg/pyproject.toml index 51e31bd..6bd6b3f 100644 --- a/plugins/data-designer-retrieval-sdg/pyproject.toml +++ b/plugins/data-designer-retrieval-sdg/pyproject.toml @@ -8,10 +8,14 @@ description = "Retriever SDG toolkit: registers the embedding-dedup column gener requires-python = ">=3.10" dependencies = [ "data-designer>=0.8.0", + # Data Designer 0.8 permits older releases that are excluded by the + # workspace security constraints. Publish the same floors for consumers. + "mcp>=1.29.0,<2", "nltk>=3.10.2,<3.11", "pydantic-settings>=2.14,<3", "pyyaml>=6.0", "pyarrow>=24.0.0,<25", + "starlette>=1.4.1,<2", ] license = "Apache-2.0" readme = "README.md" diff --git a/uv.lock b/uv.lock index c4311cb..02120a1 100644 --- a/uv.lock +++ b/uv.lock @@ -534,19 +534,23 @@ version = "0.2.0" source = { editable = "plugins/data-designer-retrieval-sdg" } dependencies = [ { name = "data-designer" }, + { name = "mcp" }, { name = "nltk" }, { name = "pyarrow" }, { name = "pydantic-settings" }, { name = "pyyaml" }, + { name = "starlette" }, ] [package.metadata] requires-dist = [ { name = "data-designer", specifier = ">=0.8.0" }, + { name = "mcp", specifier = ">=1.29.0,<2" }, { name = "nltk", specifier = ">=3.10.2,<3.11" }, { name = "pyarrow", specifier = ">=24.0.0,<25" }, { name = "pydantic-settings", specifier = ">=2.14,<3" }, { name = "pyyaml", specifier = ">=6.0" }, + { name = "starlette", specifier = ">=1.4.1,<2" }, ] [[package]] From 30434fc45417bcea2384d56e781d3b111477932b Mon Sep 17 00:00:00 2001 From: Steve Han Date: Mon, 10 Aug 2026 13:02:23 -0400 Subject: [PATCH 4/6] docs: refresh retrieval SDG compatibility metadata --- catalog/plugins.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/catalog/plugins.json b/catalog/plugins.json index 27039a8..0baa53c 100644 --- a/catalog/plugins.json +++ b/catalog/plugins.json @@ -45,8 +45,8 @@ "specifier": ">=3.10" }, "data_designer": { - "requirement": "data-designer>=0.6.1", - "specifier": ">=0.6.1", + "requirement": "data-designer>=0.8.0", + "specifier": ">=0.8.0", "marker": null } }, From 2f5ae371c007035c6f016c9c01699a97747b7e6e Mon Sep 17 00:00:00 2001 From: Steve Han Date: Mon, 10 Aug 2026 17:46:24 -0400 Subject: [PATCH 5/6] fix(retrieval-sdg): normalize evaluation score types --- catalog/plugins.json | 11 ++++- .../data-designer-retrieval-sdg/index.md | 4 +- docs/plugins/index.md | 4 +- plugins/data-designer-retrieval-sdg/README.md | 34 ++++++++++--- .../pyproject.toml | 3 +- .../data_designer_retrieval_sdg/__init__.py | 7 ++- .../src/data_designer_retrieval_sdg/config.py | 24 +++++++++- .../evaluation_normalizer.py | 37 ++++++++++++++ .../data_designer_retrieval_sdg/pipeline.py | 9 +++- .../data_designer_retrieval_sdg/plugins.py | 11 ++++- .../tests/test_evaluation_normalizer.py | 48 +++++++++++++++++++ .../tests/test_pipeline.py | 11 +++++ .../tests/test_plugin.py | 12 ++++- 13 files changed, 195 insertions(+), 20 deletions(-) create mode 100644 plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/evaluation_normalizer.py create mode 100644 plugins/data-designer-retrieval-sdg/tests/test_evaluation_normalizer.py diff --git a/catalog/plugins.json b/catalog/plugins.json index 88b8bee..992b4c7 100644 --- a/catalog/plugins.json +++ b/catalog/plugins.json @@ -35,7 +35,7 @@ }, { "name": "data-designer-retrieval-sdg", - "description": "Retriever SDG toolkit: registers the embedding-dedup column generator and document-chunker seed reader, plus a multi-step QA generation pipeline, CLI, and Automodel-compatible data conversion", + "description": "Retriever SDG toolkit with Data Designer extensions, a multi-step QA generation pipeline, CLI, and Automodel-compatible data conversion", "install": { "requirement": "data-designer-retrieval-sdg", "index_url": "https://nvidia-nemo.github.io/DataDesignerPlugins/simple/" @@ -71,6 +71,15 @@ "name": "embedding-dedup", "value": "data_designer_retrieval_sdg.plugins:embedding_dedup_plugin" } + }, + { + "name": "qa-evaluation-normalizer", + "plugin_type": "processor", + "entry_point": { + "group": "data_designer.plugins", + "name": "qa-evaluation-normalizer", + "value": "data_designer_retrieval_sdg.plugins:qa_evaluation_normalizer_plugin" + } } ] } diff --git a/docs/plugins/data-designer-retrieval-sdg/index.md b/docs/plugins/data-designer-retrieval-sdg/index.md index 1e005b3..6114f8f 100644 --- a/docs/plugins/data-designer-retrieval-sdg/index.md +++ b/docs/plugins/data-designer-retrieval-sdg/index.md @@ -2,7 +2,7 @@ # data-designer-retrieval-sdg -Retriever SDG toolkit: registers the embedding-dedup column generator and document-chunker seed reader, plus a multi-step QA generation pipeline, CLI, and Automodel-compatible data conversion +Retriever SDG toolkit with Data Designer extensions, a multi-step QA generation pipeline, CLI, and Automodel-compatible data conversion This page is generated from package metadata because the plugin has not added custom documentation under `plugins/data-designer-retrieval-sdg/docs/` yet. @@ -10,7 +10,7 @@ custom documentation under `plugins/data-designer-retrieval-sdg/docs/` yet. ## Metadata - Version: `0.2.0` -- Entry points: `document-chunker`, `embedding-dedup` +- Entry points: `document-chunker`, `embedding-dedup`, `qa-evaluation-normalizer` ## Installation diff --git a/docs/plugins/index.md b/docs/plugins/index.md index 3b98208..f287b34 100644 --- a/docs/plugins/index.md +++ b/docs/plugins/index.md @@ -21,10 +21,10 @@ Browse available Data Designer plugins by what they add to your data generation data-designer-retrieval-sdg v0.2.0 - Retriever SDG toolkit: registers the embedding-dedup column generator and document-chunker seed reader, plus a multi-step QA generation pipeline, CLI, and Automodel-compatible data conversion + Retriever SDG toolkit with Data Designer extensions, a multi-step QA generation pipeline, CLI, and Automodel-compatible data conversion Entry points - document-chunkerembedding-dedup + document-chunkerembedding-dedupqa-evaluation-normalizer diff --git a/plugins/data-designer-retrieval-sdg/README.md b/plugins/data-designer-retrieval-sdg/README.md index 06595ff..a31f187 100644 --- a/plugins/data-designer-retrieval-sdg/README.md +++ b/plugins/data-designer-retrieval-sdg/README.md @@ -1,7 +1,7 @@ # data-designer-retrieval-sdg Data Designer toolkit for **retriever synthetic data generation**. The -package registers two `data_designer.plugins` entry points, ships a +package registers three `data_designer.plugins` entry points, ships a ready-made multi-step QA generation pipeline, and exposes a CLI that generates QA pairs and converts them into training formats compatible with [Automodel](https://github.com/NVIDIA-NeMo/Automodel) retriever @@ -9,15 +9,16 @@ finetuning. ## Plugins -A single package contributes two plugins to DataDesigner's registries +A single package contributes three plugins to DataDesigner's registries via `[project.entry-points."data_designer.plugins"]`: | Slug | Type | Purpose | |------|------|---------| | `embedding-dedup` | column generator | Generic cosine-similarity dedup of any list-valued column. Implements native `agenerate()` for the async engine. | | `document-chunker` | seed reader | Sentence-chunks a directory of text files and emits structured sections, with optional multi-document bundling. | +| `qa-evaluation-normalizer` | processor | Normalizes overall QA evaluation scores before each Parquet checkpoint so integral and fractional model outputs remain schema-compatible. | -Both are registered automatically through Python entry points when the +All three are registered automatically through Python entry points when the package is installed (see [Installation](#installation)). ## Native async and resumable generation @@ -45,9 +46,9 @@ compatibility, partial-result cleanup, and the behavior of every resume mode. Th plugin does not maintain a second resume state or inspect corpus bytes. `--buffer-size` controls DataDesigner's checkpoint/write granularity and remains -part of the resolved config. In DataDesigner 0.6.1, `create()` still profiles the -completed dataset before returning, so `--buffer-size` is not a hard cap on final -peak memory for very large runs. +part of the resolved config. DataDesigner still profiles the completed dataset +before returning, so `--buffer-size` is not a hard cap on final peak memory for +very large runs. ## Installation @@ -283,6 +284,27 @@ config_builder.add_column( ) ``` +### `qa-evaluation-normalizer` processor + +The packaged QA generation pipeline adds this processor automatically. Custom +pipelines that use the same evaluation schema can add it explicitly: + +```python +from data_designer_retrieval_sdg.config import QAEvaluationNormalizerConfig + +config_builder.add_processor( + QAEvaluationNormalizerConfig( + name="normalize_qa_evaluation_scores", + column_name="qa_evaluations", + ) +) +``` + +The processor runs immediately before each row group is checkpointed. It +normalizes integral overall scores such as `9` to `9.0` while preserving +fractional scores such as `9.5`, preventing incompatible Parquet schemas across +row groups. + ### `document-chunker` seed reader ```python diff --git a/plugins/data-designer-retrieval-sdg/pyproject.toml b/plugins/data-designer-retrieval-sdg/pyproject.toml index 9b4ac94..59c72ec 100644 --- a/plugins/data-designer-retrieval-sdg/pyproject.toml +++ b/plugins/data-designer-retrieval-sdg/pyproject.toml @@ -4,7 +4,7 @@ [project] name = "data-designer-retrieval-sdg" version = "0.2.0" -description = "Retriever SDG toolkit: registers the embedding-dedup column generator and document-chunker seed reader, plus a multi-step QA generation pipeline, CLI, and Automodel-compatible data conversion" +description = "Retriever SDG toolkit with Data Designer extensions, a multi-step QA generation pipeline, CLI, and Automodel-compatible data conversion" requires-python = ">=3.10" dependencies = [ "data-designer>=0.9.0", @@ -31,6 +31,7 @@ classifiers = [ [project.entry-points."data_designer.plugins"] embedding-dedup = "data_designer_retrieval_sdg.plugins:embedding_dedup_plugin" document-chunker = "data_designer_retrieval_sdg.plugins:document_chunker_plugin" +qa-evaluation-normalizer = "data_designer_retrieval_sdg.plugins:qa_evaluation_normalizer_plugin" [project.scripts] data-designer-retrieval-sdg = "data_designer_retrieval_sdg.cli:main" diff --git a/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/__init__.py b/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/__init__.py index 8e726ab..3737ab4 100644 --- a/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/__init__.py +++ b/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/__init__.py @@ -3,11 +3,13 @@ """Data Designer plugins and pipeline for retriever synthetic data generation. -The package registers two ``data_designer.plugins`` entry points: +The package registers three ``data_designer.plugins`` entry points: - ``embedding-dedup``: generic embedding-cosine-similarity column generator. - ``document-chunker``: filesystem seed reader that loads text files, sentence-chunks them, and emits structured sections. +- ``qa-evaluation-normalizer``: post-batch processor that stabilizes + overall score types before Parquet checkpointing. It also ships a ready-made four-column QA generation pipeline, a CLI for running the pipeline end-to-end (``generate``) and exporting to NeMo @@ -18,7 +20,7 @@ from importlib import import_module from typing import Any -from data_designer_retrieval_sdg.config import EmbeddingDedupColumnConfig +from data_designer_retrieval_sdg.config import EmbeddingDedupColumnConfig, QAEvaluationNormalizerConfig from data_designer_retrieval_sdg.pipeline import build_model_providers, build_qa_generation_pipeline from data_designer_retrieval_sdg.postprocess import ( filter_qa_pairs_by_quality, @@ -30,6 +32,7 @@ __all__ = [ "DocumentChunkerSeedSource", "EmbeddingDedupColumnConfig", + "QAEvaluationNormalizerConfig", "ConfigSource", "ConversionResult", "ConversionRunConfig", diff --git a/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/config.py b/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/config.py index 30ac3c3..6e794d9 100644 --- a/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/config.py +++ b/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/config.py @@ -1,13 +1,13 @@ # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 -"""Column configuration for the embedding-dedup plugin.""" +"""Configuration models for retriever SDG Data Designer plugins.""" from __future__ import annotations from typing import Literal -from data_designer.config.base import SingleColumnConfig +from data_designer.config.base import ProcessorConfig, SingleColumnConfig class EmbeddingDedupColumnConfig(SingleColumnConfig): @@ -57,3 +57,23 @@ def side_effect_columns(self) -> list[str]: def get_column_emoji(self) -> str: """Emoji displayed in logs for this column type.""" return "🔍" + + +class QAEvaluationNormalizerConfig(ProcessorConfig): + """Normalize QA evaluation scores before each batch is checkpointed. + + Structured LLM responses can encode an integral overall score as either + ``9`` or ``9.0``. Arrow infers those values as different physical types + when they occur in separate row groups. This processor validates the + response through the pipeline's Pydantic model so every overall score is + serialized as a float before Data Designer writes Parquet. + + Attributes: + column_name: Structured QA evaluation column to normalize. + processor_type: Fixed literal identifying this processor type. + Inherited Attributes: + name (required): Unique name of the processor. + """ + + column_name: str = "qa_evaluations" + processor_type: Literal["qa-evaluation-normalizer"] = "qa-evaluation-normalizer" diff --git a/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/evaluation_normalizer.py b/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/evaluation_normalizer.py new file mode 100644 index 0000000..bb7b8e6 --- /dev/null +++ b/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/evaluation_normalizer.py @@ -0,0 +1,37 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Post-batch normalization for structured QA evaluation output.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING, Any + +from data_designer.engine.processing.processors.base import Processor + +from data_designer_retrieval_sdg.config import QAEvaluationNormalizerConfig +from data_designer_retrieval_sdg.models import QAPairEvaluations + +if TYPE_CHECKING: + import pandas as pd + + +def normalize_qa_evaluations(value: Any) -> Any: + """Return a JSON-compatible evaluation value with stable numeric types.""" + if value is None: + return None + return QAPairEvaluations.model_validate(value).model_dump(mode="json") + + +class QAEvaluationNormalizer(Processor[QAEvaluationNormalizerConfig]): + """Normalize structured QA evaluations before Parquet checkpointing.""" + + def process_after_batch(self, data: pd.DataFrame, *, current_batch_number: int | None) -> pd.DataFrame: + """Coerce overall scores to floats without changing row count or order.""" + column_name = self.config.column_name + if column_name not in data.columns: + raise ValueError(f"QA evaluation column {column_name!r} was not found in the generated batch") + + normalized = data.copy() + normalized[column_name] = normalized[column_name].map(normalize_qa_evaluations) + return normalized diff --git a/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/pipeline.py b/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/pipeline.py index 206151e..cf6e03a 100644 --- a/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/pipeline.py +++ b/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/pipeline.py @@ -19,7 +19,7 @@ import data_designer.config as dd from data_designer.config.default_model_settings import get_default_providers -from data_designer_retrieval_sdg.config import EmbeddingDedupColumnConfig +from data_designer_retrieval_sdg.config import EmbeddingDedupColumnConfig, QAEvaluationNormalizerConfig from data_designer_retrieval_sdg.models import ( DocumentArtifacts, QAPairEvaluations, @@ -364,4 +364,11 @@ def build_qa_generation_pipeline( ) ) + config_builder.add_processor( + QAEvaluationNormalizerConfig( + name="normalize_qa_evaluation_scores", + column_name="qa_evaluations", + ) + ) + return config_builder diff --git a/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/plugins.py b/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/plugins.py index 26606f1..324d3cb 100644 --- a/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/plugins.py +++ b/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/plugins.py @@ -3,13 +3,16 @@ """Data Designer plugin registrations exported by this package. -Two ``data_designer.plugins`` entry points are wired here: +Three ``data_designer.plugins`` entry points are wired here: - :data:`embedding_dedup_plugin` -- generic embedding-cosine-similarity deduplication column generator (``column_type="embedding-dedup"``). - :data:`document_chunker_plugin` -- filesystem seed reader that loads text files, chunks them by sentence, and emits structured sections (``seed_type="document-chunker"``). +- :data:`qa_evaluation_normalizer_plugin` -- post-batch processor that + stabilizes QA evaluation score types before Parquet checkpointing + (``processor_type="qa-evaluation-normalizer"``). """ from data_designer.plugins.plugin import Plugin, PluginType @@ -25,3 +28,9 @@ impl_qualified_name="data_designer_retrieval_sdg.seed_reader.DocumentChunkerSeedReader", plugin_type=PluginType.SEED_READER, ) + +qa_evaluation_normalizer_plugin = Plugin( + config_qualified_name="data_designer_retrieval_sdg.config.QAEvaluationNormalizerConfig", + impl_qualified_name="data_designer_retrieval_sdg.evaluation_normalizer.QAEvaluationNormalizer", + plugin_type=PluginType.PROCESSOR, +) diff --git a/plugins/data-designer-retrieval-sdg/tests/test_evaluation_normalizer.py b/plugins/data-designer-retrieval-sdg/tests/test_evaluation_normalizer.py new file mode 100644 index 0000000..f67a6c9 --- /dev/null +++ b/plugins/data-designer-retrieval-sdg/tests/test_evaluation_normalizer.py @@ -0,0 +1,48 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Regression tests for QA evaluation score normalization.""" + +from pathlib import Path +from unittest.mock import MagicMock + +import pandas as pd +import pyarrow.dataset as ds + +from data_designer_retrieval_sdg.config import QAEvaluationNormalizerConfig +from data_designer_retrieval_sdg.evaluation_normalizer import QAEvaluationNormalizer + + +def _qa_evaluations(overall_score: int | float) -> dict: + criterion = {"score": 9, "justification": "good"} + return { + "evaluations": [ + { + "relevance": criterion, + "accuracy": criterion, + "context_support": criterion, + "clarity": criterion, + "overall": {"score": overall_score, "assessment": "good"}, + "improvements": "none", + } + ] + } + + +def test_integral_and_fractional_scores_share_a_parquet_schema(tmp_path: Path) -> None: + processor = QAEvaluationNormalizer( + config=QAEvaluationNormalizerConfig(name="normalize_scores"), + resource_provider=MagicMock(), + ) + + parquet_dir = tmp_path / "parquet-files" + parquet_dir.mkdir() + for batch_number, score in enumerate((9, 9.5)): + batch = pd.DataFrame({"qa_evaluations": [_qa_evaluations(score)]}) + normalized = processor.process_after_batch(batch, current_batch_number=batch_number) + normalized.to_parquet(parquet_dir / f"batch_{batch_number:05d}.parquet", index=False) + + records = ds.dataset(parquet_dir, format="parquet").to_table().to_pylist() + scores = [record["qa_evaluations"]["evaluations"][0]["overall"]["score"] for record in records] + assert scores == [9.0, 9.5] + assert all(isinstance(score, float) for score in scores) diff --git a/plugins/data-designer-retrieval-sdg/tests/test_pipeline.py b/plugins/data-designer-retrieval-sdg/tests/test_pipeline.py index 896e3d4..7349d65 100644 --- a/plugins/data-designer-retrieval-sdg/tests/test_pipeline.py +++ b/plugins/data-designer-retrieval-sdg/tests/test_pipeline.py @@ -17,6 +17,7 @@ build_qa_generation_pipeline, ) from data_designer_retrieval_sdg.run_config import GenerationPipelineConfig +from data_designer_retrieval_sdg.seed_source import DocumentChunkerSeedSource def test_defaults_match_canonical_nemotron_models() -> None: @@ -48,6 +49,16 @@ def test_pipeline_builder_defaults_match_typed_config() -> None: assert parameters[field_name].default == getattr(config, field_name) +def test_pipeline_normalizes_qa_evaluation_scores_before_checkpointing() -> None: + builder = build_qa_generation_pipeline( + seed_source=DocumentChunkerSeedSource(path="."), + ) + + processor = builder.build().processors[0] + assert processor.processor_type == "qa-evaluation-normalizer" + assert processor.column_name == "qa_evaluations" + + def test_provider_builder_combines_distinct_aliases(tmp_path: Path) -> None: providers_file = tmp_path / "providers.json" providers_file.write_text( diff --git a/plugins/data-designer-retrieval-sdg/tests/test_plugin.py b/plugins/data-designer-retrieval-sdg/tests/test_plugin.py index d256f80..4e6a19c 100644 --- a/plugins/data-designer-retrieval-sdg/tests/test_plugin.py +++ b/plugins/data-designer-retrieval-sdg/tests/test_plugin.py @@ -1,11 +1,15 @@ # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 -"""Plugin-registration tests for both entry points.""" +"""Plugin-registration tests for all entry points.""" from data_designer.engine.testing.utils import assert_valid_plugin -from data_designer_retrieval_sdg.plugins import document_chunker_plugin, embedding_dedup_plugin +from data_designer_retrieval_sdg.plugins import ( + document_chunker_plugin, + embedding_dedup_plugin, + qa_evaluation_normalizer_plugin, +) def test_embedding_dedup_plugin_valid() -> None: @@ -14,3 +18,7 @@ def test_embedding_dedup_plugin_valid() -> None: def test_document_chunker_plugin_valid() -> None: assert_valid_plugin(document_chunker_plugin) + + +def test_qa_evaluation_normalizer_plugin_valid() -> None: + assert_valid_plugin(qa_evaluation_normalizer_plugin) From b9f17dd91c937a328f9a63a5cd4ca6d86f6e48e1 Mon Sep 17 00:00:00 2001 From: Steve Han Date: Tue, 11 Aug 2026 16:42:43 -0400 Subject: [PATCH 6/6] chore(retrieval-sdg): require Data Designer 0.9.1 --- catalog/plugins.json | 13 +---- .../data-designer-retrieval-sdg/index.md | 2 +- docs/plugins/index.md | 2 +- plugins/data-designer-retrieval-sdg/README.md | 28 ++--------- .../pyproject.toml | 3 +- .../data_designer_retrieval_sdg/__init__.py | 7 +-- .../src/data_designer_retrieval_sdg/config.py | 24 +--------- .../evaluation_normalizer.py | 37 -------------- .../data_designer_retrieval_sdg/pipeline.py | 9 +--- .../data_designer_retrieval_sdg/plugins.py | 11 +---- .../tests/test_evaluation_normalizer.py | 48 ------------------- .../tests/test_pipeline.py | 11 ----- .../tests/test_plugin.py | 12 +---- uv.lock | 20 ++++---- 14 files changed, 26 insertions(+), 201 deletions(-) delete mode 100644 plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/evaluation_normalizer.py delete mode 100644 plugins/data-designer-retrieval-sdg/tests/test_evaluation_normalizer.py diff --git a/catalog/plugins.json b/catalog/plugins.json index 992b4c7..e6f07e9 100644 --- a/catalog/plugins.json +++ b/catalog/plugins.json @@ -45,8 +45,8 @@ "specifier": ">=3.10" }, "data_designer": { - "requirement": "data-designer>=0.9.0", - "specifier": ">=0.9.0", + "requirement": "data-designer>=0.9.1", + "specifier": ">=0.9.1", "marker": null } }, @@ -71,15 +71,6 @@ "name": "embedding-dedup", "value": "data_designer_retrieval_sdg.plugins:embedding_dedup_plugin" } - }, - { - "name": "qa-evaluation-normalizer", - "plugin_type": "processor", - "entry_point": { - "group": "data_designer.plugins", - "name": "qa-evaluation-normalizer", - "value": "data_designer_retrieval_sdg.plugins:qa_evaluation_normalizer_plugin" - } } ] } diff --git a/docs/plugins/data-designer-retrieval-sdg/index.md b/docs/plugins/data-designer-retrieval-sdg/index.md index 6114f8f..0c3459c 100644 --- a/docs/plugins/data-designer-retrieval-sdg/index.md +++ b/docs/plugins/data-designer-retrieval-sdg/index.md @@ -10,7 +10,7 @@ custom documentation under `plugins/data-designer-retrieval-sdg/docs/` yet. ## Metadata - Version: `0.2.0` -- Entry points: `document-chunker`, `embedding-dedup`, `qa-evaluation-normalizer` +- Entry points: `document-chunker`, `embedding-dedup` ## Installation diff --git a/docs/plugins/index.md b/docs/plugins/index.md index f287b34..a3b4bcd 100644 --- a/docs/plugins/index.md +++ b/docs/plugins/index.md @@ -24,7 +24,7 @@ Browse available Data Designer plugins by what they add to your data generation Retriever SDG toolkit with Data Designer extensions, a multi-step QA generation pipeline, CLI, and Automodel-compatible data conversion Entry points - document-chunkerembedding-dedupqa-evaluation-normalizer + document-chunkerembedding-dedup diff --git a/plugins/data-designer-retrieval-sdg/README.md b/plugins/data-designer-retrieval-sdg/README.md index a31f187..f91c1dc 100644 --- a/plugins/data-designer-retrieval-sdg/README.md +++ b/plugins/data-designer-retrieval-sdg/README.md @@ -1,7 +1,7 @@ # data-designer-retrieval-sdg Data Designer toolkit for **retriever synthetic data generation**. The -package registers three `data_designer.plugins` entry points, ships a +package registers two `data_designer.plugins` entry points, ships a ready-made multi-step QA generation pipeline, and exposes a CLI that generates QA pairs and converts them into training formats compatible with [Automodel](https://github.com/NVIDIA-NeMo/Automodel) retriever @@ -9,16 +9,15 @@ finetuning. ## Plugins -A single package contributes three plugins to DataDesigner's registries +A single package contributes two plugins to DataDesigner's registries via `[project.entry-points."data_designer.plugins"]`: | Slug | Type | Purpose | |------|------|---------| | `embedding-dedup` | column generator | Generic cosine-similarity dedup of any list-valued column. Implements native `agenerate()` for the async engine. | | `document-chunker` | seed reader | Sentence-chunks a directory of text files and emits structured sections, with optional multi-document bundling. | -| `qa-evaluation-normalizer` | processor | Normalizes overall QA evaluation scores before each Parquet checkpoint so integral and fractional model outputs remain schema-compatible. | -All three are registered automatically through Python entry points when the +Both are registered automatically through Python entry points when the package is installed (see [Installation](#installation)). ## Native async and resumable generation @@ -284,27 +283,6 @@ config_builder.add_column( ) ``` -### `qa-evaluation-normalizer` processor - -The packaged QA generation pipeline adds this processor automatically. Custom -pipelines that use the same evaluation schema can add it explicitly: - -```python -from data_designer_retrieval_sdg.config import QAEvaluationNormalizerConfig - -config_builder.add_processor( - QAEvaluationNormalizerConfig( - name="normalize_qa_evaluation_scores", - column_name="qa_evaluations", - ) -) -``` - -The processor runs immediately before each row group is checkpointed. It -normalizes integral overall scores such as `9` to `9.0` while preserving -fractional scores such as `9.5`, preventing incompatible Parquet schemas across -row groups. - ### `document-chunker` seed reader ```python diff --git a/plugins/data-designer-retrieval-sdg/pyproject.toml b/plugins/data-designer-retrieval-sdg/pyproject.toml index 59c72ec..e2b865e 100644 --- a/plugins/data-designer-retrieval-sdg/pyproject.toml +++ b/plugins/data-designer-retrieval-sdg/pyproject.toml @@ -7,7 +7,7 @@ version = "0.2.0" description = "Retriever SDG toolkit with Data Designer extensions, a multi-step QA generation pipeline, CLI, and Automodel-compatible data conversion" requires-python = ">=3.10" dependencies = [ - "data-designer>=0.9.0", + "data-designer>=0.9.1", # Data Designer permits older transitive releases that are excluded by the # workspace security constraints. Publish the same floors for consumers. "mcp>=1.29.0,<2", @@ -31,7 +31,6 @@ classifiers = [ [project.entry-points."data_designer.plugins"] embedding-dedup = "data_designer_retrieval_sdg.plugins:embedding_dedup_plugin" document-chunker = "data_designer_retrieval_sdg.plugins:document_chunker_plugin" -qa-evaluation-normalizer = "data_designer_retrieval_sdg.plugins:qa_evaluation_normalizer_plugin" [project.scripts] data-designer-retrieval-sdg = "data_designer_retrieval_sdg.cli:main" diff --git a/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/__init__.py b/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/__init__.py index 3737ab4..8e726ab 100644 --- a/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/__init__.py +++ b/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/__init__.py @@ -3,13 +3,11 @@ """Data Designer plugins and pipeline for retriever synthetic data generation. -The package registers three ``data_designer.plugins`` entry points: +The package registers two ``data_designer.plugins`` entry points: - ``embedding-dedup``: generic embedding-cosine-similarity column generator. - ``document-chunker``: filesystem seed reader that loads text files, sentence-chunks them, and emits structured sections. -- ``qa-evaluation-normalizer``: post-batch processor that stabilizes - overall score types before Parquet checkpointing. It also ships a ready-made four-column QA generation pipeline, a CLI for running the pipeline end-to-end (``generate``) and exporting to NeMo @@ -20,7 +18,7 @@ from importlib import import_module from typing import Any -from data_designer_retrieval_sdg.config import EmbeddingDedupColumnConfig, QAEvaluationNormalizerConfig +from data_designer_retrieval_sdg.config import EmbeddingDedupColumnConfig from data_designer_retrieval_sdg.pipeline import build_model_providers, build_qa_generation_pipeline from data_designer_retrieval_sdg.postprocess import ( filter_qa_pairs_by_quality, @@ -32,7 +30,6 @@ __all__ = [ "DocumentChunkerSeedSource", "EmbeddingDedupColumnConfig", - "QAEvaluationNormalizerConfig", "ConfigSource", "ConversionResult", "ConversionRunConfig", diff --git a/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/config.py b/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/config.py index 6e794d9..30ac3c3 100644 --- a/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/config.py +++ b/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/config.py @@ -1,13 +1,13 @@ # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 -"""Configuration models for retriever SDG Data Designer plugins.""" +"""Column configuration for the embedding-dedup plugin.""" from __future__ import annotations from typing import Literal -from data_designer.config.base import ProcessorConfig, SingleColumnConfig +from data_designer.config.base import SingleColumnConfig class EmbeddingDedupColumnConfig(SingleColumnConfig): @@ -57,23 +57,3 @@ def side_effect_columns(self) -> list[str]: def get_column_emoji(self) -> str: """Emoji displayed in logs for this column type.""" return "🔍" - - -class QAEvaluationNormalizerConfig(ProcessorConfig): - """Normalize QA evaluation scores before each batch is checkpointed. - - Structured LLM responses can encode an integral overall score as either - ``9`` or ``9.0``. Arrow infers those values as different physical types - when they occur in separate row groups. This processor validates the - response through the pipeline's Pydantic model so every overall score is - serialized as a float before Data Designer writes Parquet. - - Attributes: - column_name: Structured QA evaluation column to normalize. - processor_type: Fixed literal identifying this processor type. - Inherited Attributes: - name (required): Unique name of the processor. - """ - - column_name: str = "qa_evaluations" - processor_type: Literal["qa-evaluation-normalizer"] = "qa-evaluation-normalizer" diff --git a/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/evaluation_normalizer.py b/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/evaluation_normalizer.py deleted file mode 100644 index bb7b8e6..0000000 --- a/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/evaluation_normalizer.py +++ /dev/null @@ -1,37 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Post-batch normalization for structured QA evaluation output.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from data_designer.engine.processing.processors.base import Processor - -from data_designer_retrieval_sdg.config import QAEvaluationNormalizerConfig -from data_designer_retrieval_sdg.models import QAPairEvaluations - -if TYPE_CHECKING: - import pandas as pd - - -def normalize_qa_evaluations(value: Any) -> Any: - """Return a JSON-compatible evaluation value with stable numeric types.""" - if value is None: - return None - return QAPairEvaluations.model_validate(value).model_dump(mode="json") - - -class QAEvaluationNormalizer(Processor[QAEvaluationNormalizerConfig]): - """Normalize structured QA evaluations before Parquet checkpointing.""" - - def process_after_batch(self, data: pd.DataFrame, *, current_batch_number: int | None) -> pd.DataFrame: - """Coerce overall scores to floats without changing row count or order.""" - column_name = self.config.column_name - if column_name not in data.columns: - raise ValueError(f"QA evaluation column {column_name!r} was not found in the generated batch") - - normalized = data.copy() - normalized[column_name] = normalized[column_name].map(normalize_qa_evaluations) - return normalized diff --git a/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/pipeline.py b/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/pipeline.py index cf6e03a..206151e 100644 --- a/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/pipeline.py +++ b/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/pipeline.py @@ -19,7 +19,7 @@ import data_designer.config as dd from data_designer.config.default_model_settings import get_default_providers -from data_designer_retrieval_sdg.config import EmbeddingDedupColumnConfig, QAEvaluationNormalizerConfig +from data_designer_retrieval_sdg.config import EmbeddingDedupColumnConfig from data_designer_retrieval_sdg.models import ( DocumentArtifacts, QAPairEvaluations, @@ -364,11 +364,4 @@ def build_qa_generation_pipeline( ) ) - config_builder.add_processor( - QAEvaluationNormalizerConfig( - name="normalize_qa_evaluation_scores", - column_name="qa_evaluations", - ) - ) - return config_builder diff --git a/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/plugins.py b/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/plugins.py index 324d3cb..26606f1 100644 --- a/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/plugins.py +++ b/plugins/data-designer-retrieval-sdg/src/data_designer_retrieval_sdg/plugins.py @@ -3,16 +3,13 @@ """Data Designer plugin registrations exported by this package. -Three ``data_designer.plugins`` entry points are wired here: +Two ``data_designer.plugins`` entry points are wired here: - :data:`embedding_dedup_plugin` -- generic embedding-cosine-similarity deduplication column generator (``column_type="embedding-dedup"``). - :data:`document_chunker_plugin` -- filesystem seed reader that loads text files, chunks them by sentence, and emits structured sections (``seed_type="document-chunker"``). -- :data:`qa_evaluation_normalizer_plugin` -- post-batch processor that - stabilizes QA evaluation score types before Parquet checkpointing - (``processor_type="qa-evaluation-normalizer"``). """ from data_designer.plugins.plugin import Plugin, PluginType @@ -28,9 +25,3 @@ impl_qualified_name="data_designer_retrieval_sdg.seed_reader.DocumentChunkerSeedReader", plugin_type=PluginType.SEED_READER, ) - -qa_evaluation_normalizer_plugin = Plugin( - config_qualified_name="data_designer_retrieval_sdg.config.QAEvaluationNormalizerConfig", - impl_qualified_name="data_designer_retrieval_sdg.evaluation_normalizer.QAEvaluationNormalizer", - plugin_type=PluginType.PROCESSOR, -) diff --git a/plugins/data-designer-retrieval-sdg/tests/test_evaluation_normalizer.py b/plugins/data-designer-retrieval-sdg/tests/test_evaluation_normalizer.py deleted file mode 100644 index f67a6c9..0000000 --- a/plugins/data-designer-retrieval-sdg/tests/test_evaluation_normalizer.py +++ /dev/null @@ -1,48 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Regression tests for QA evaluation score normalization.""" - -from pathlib import Path -from unittest.mock import MagicMock - -import pandas as pd -import pyarrow.dataset as ds - -from data_designer_retrieval_sdg.config import QAEvaluationNormalizerConfig -from data_designer_retrieval_sdg.evaluation_normalizer import QAEvaluationNormalizer - - -def _qa_evaluations(overall_score: int | float) -> dict: - criterion = {"score": 9, "justification": "good"} - return { - "evaluations": [ - { - "relevance": criterion, - "accuracy": criterion, - "context_support": criterion, - "clarity": criterion, - "overall": {"score": overall_score, "assessment": "good"}, - "improvements": "none", - } - ] - } - - -def test_integral_and_fractional_scores_share_a_parquet_schema(tmp_path: Path) -> None: - processor = QAEvaluationNormalizer( - config=QAEvaluationNormalizerConfig(name="normalize_scores"), - resource_provider=MagicMock(), - ) - - parquet_dir = tmp_path / "parquet-files" - parquet_dir.mkdir() - for batch_number, score in enumerate((9, 9.5)): - batch = pd.DataFrame({"qa_evaluations": [_qa_evaluations(score)]}) - normalized = processor.process_after_batch(batch, current_batch_number=batch_number) - normalized.to_parquet(parquet_dir / f"batch_{batch_number:05d}.parquet", index=False) - - records = ds.dataset(parquet_dir, format="parquet").to_table().to_pylist() - scores = [record["qa_evaluations"]["evaluations"][0]["overall"]["score"] for record in records] - assert scores == [9.0, 9.5] - assert all(isinstance(score, float) for score in scores) diff --git a/plugins/data-designer-retrieval-sdg/tests/test_pipeline.py b/plugins/data-designer-retrieval-sdg/tests/test_pipeline.py index 7349d65..896e3d4 100644 --- a/plugins/data-designer-retrieval-sdg/tests/test_pipeline.py +++ b/plugins/data-designer-retrieval-sdg/tests/test_pipeline.py @@ -17,7 +17,6 @@ build_qa_generation_pipeline, ) from data_designer_retrieval_sdg.run_config import GenerationPipelineConfig -from data_designer_retrieval_sdg.seed_source import DocumentChunkerSeedSource def test_defaults_match_canonical_nemotron_models() -> None: @@ -49,16 +48,6 @@ def test_pipeline_builder_defaults_match_typed_config() -> None: assert parameters[field_name].default == getattr(config, field_name) -def test_pipeline_normalizes_qa_evaluation_scores_before_checkpointing() -> None: - builder = build_qa_generation_pipeline( - seed_source=DocumentChunkerSeedSource(path="."), - ) - - processor = builder.build().processors[0] - assert processor.processor_type == "qa-evaluation-normalizer" - assert processor.column_name == "qa_evaluations" - - def test_provider_builder_combines_distinct_aliases(tmp_path: Path) -> None: providers_file = tmp_path / "providers.json" providers_file.write_text( diff --git a/plugins/data-designer-retrieval-sdg/tests/test_plugin.py b/plugins/data-designer-retrieval-sdg/tests/test_plugin.py index 4e6a19c..d256f80 100644 --- a/plugins/data-designer-retrieval-sdg/tests/test_plugin.py +++ b/plugins/data-designer-retrieval-sdg/tests/test_plugin.py @@ -1,15 +1,11 @@ # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 -"""Plugin-registration tests for all entry points.""" +"""Plugin-registration tests for both entry points.""" from data_designer.engine.testing.utils import assert_valid_plugin -from data_designer_retrieval_sdg.plugins import ( - document_chunker_plugin, - embedding_dedup_plugin, - qa_evaluation_normalizer_plugin, -) +from data_designer_retrieval_sdg.plugins import document_chunker_plugin, embedding_dedup_plugin def test_embedding_dedup_plugin_valid() -> None: @@ -18,7 +14,3 @@ def test_embedding_dedup_plugin_valid() -> None: def test_document_chunker_plugin_valid() -> None: assert_valid_plugin(document_chunker_plugin) - - -def test_qa_evaluation_normalizer_plugin_valid() -> None: - assert_valid_plugin(qa_evaluation_normalizer_plugin) diff --git a/uv.lock b/uv.lock index 1dad590..6218578 100644 --- a/uv.lock +++ b/uv.lock @@ -387,7 +387,7 @@ wheels = [ [[package]] name = "data-designer" -version = "0.9.0" +version = "0.9.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "data-designer-config" }, @@ -406,14 +406,14 @@ dependencies = [ { name = "rich" }, { name = "typer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/54/b6/27e8c112c5801500c7e7ccd70f0751376e6b6fb427c2e7b6256bb1d24e31/data_designer-0.9.0.tar.gz", hash = "sha256:11339a7c6188159cd4b065216964417a6f19863ef91e2c49c46fcb227719616b", size = 234004, upload-time = "2026-08-10T18:52:09.63Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/aa/fb60615233d3e23044ce9cd52a98ebdbdbb19ab0fcc57a0fd7fb19bf581e/data_designer-0.9.1.tar.gz", hash = "sha256:ce6d4bc9fcd2c10fb59c28fe8f495cfb5fa39952b17b3d0b159b7dfc7fd724c1", size = 233997, upload-time = "2026-08-11T20:24:20.853Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/22/56d08785bb036e0b93268d83f9927957de8e959aa23cdfeaa3d1eea3fa86/data_designer-0.9.0-py3-none-any.whl", hash = "sha256:28cc355d979632674e2577df287a3622da37e6a505fe88aa7819242fc4d4ac78", size = 158442, upload-time = "2026-08-10T18:52:08.513Z" }, + { url = "https://files.pythonhosted.org/packages/6f/0d/2bb0d06e554e50d7e3affb41c853fdd31e08413255506e2c87ab02f10362/data_designer-0.9.1-py3-none-any.whl", hash = "sha256:c1b02b11baddd89a9ebdc6105bfdd84ec970dce0cb7079767c53d6995e08475c", size = 158442, upload-time = "2026-08-11T20:24:19.495Z" }, ] [[package]] name = "data-designer-config" -version = "0.9.0" +version = "0.9.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx" }, @@ -432,14 +432,14 @@ dependencies = [ { name = "rich" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e2/7a/a47c4957aafa8dba39ff82cc78051f635f65866a47cd01a3b2c4b2787fa0/data_designer_config-0.9.0.tar.gz", hash = "sha256:dd51d5cb005f7656fae54d2745d77e12a03cb17adc4d2d24f2f1ae16c1457479", size = 150932, upload-time = "2026-08-10T18:52:02.944Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/4c/fb3791f43b5b0abd054ed55f1a4e13e10187090ee43eaf6801cfc8e713b9/data_designer_config-0.9.1.tar.gz", hash = "sha256:d4aca73a5b21284729e6f5b05ed1eba7c6e1b7c77d591c6e4e2f330b508d5c39", size = 151409, upload-time = "2026-08-11T20:24:14.236Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/24/2b/d909f19d098b6fcf1a033c468de36904352b84e3518a567c91d0f56b6203/data_designer_config-0.9.0-py3-none-any.whl", hash = "sha256:e9f7abd856d0a363094b4016fb0fd51c02a7d19b3e2472c2d67d9418baca35ea", size = 128526, upload-time = "2026-08-10T18:52:01.799Z" }, + { url = "https://files.pythonhosted.org/packages/37/f8/a12b44092eaabb2fa431474eef069885c6d4aed576677d7c344095051733/data_designer_config-0.9.1-py3-none-any.whl", hash = "sha256:8944578a74f28980b7b06b5b12c5e866da313af3fe6b5cc5d446bedf5756744e", size = 128696, upload-time = "2026-08-11T20:24:12.669Z" }, ] [[package]] name = "data-designer-engine" -version = "0.9.0" +version = "0.9.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyascii" }, @@ -477,9 +477,9 @@ dependencies = [ { name = "tiktoken" }, { name = "wcwidth" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/97/65/a9bb62514b0a8c9ab1dd51d43dc71ad463c782d311b7eab3ebb09652e349/data_designer_engine-0.9.0.tar.gz", hash = "sha256:fda48fc29eba8da25c94d8404ddf2f44c7318478dacc8a1ac768ef7732ff8047", size = 918434, upload-time = "2026-08-10T18:52:06.67Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/a4/9f8f74d0512698ed2013ba3728e92ed7750e231974b4aadb24c46b7bb30e/data_designer_engine-0.9.1.tar.gz", hash = "sha256:d86822d227335980fb70a993327e1e754216c8181b474c5c58590ac8e465dbdf", size = 918436, upload-time = "2026-08-11T20:24:17.621Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/49/46/a467f480d7904615a00b09b1396ced30b98accf7badc395be3a19ae2b0bc/data_designer_engine-0.9.0-py3-none-any.whl", hash = "sha256:32cc4006f6ff19a4297451d4f34cbe62d508fce4b07c5402d40e3a98401f493c", size = 706028, upload-time = "2026-08-10T18:52:04.876Z" }, + { url = "https://files.pythonhosted.org/packages/66/2b/58240f5eec8d73b47eb204f381f4302447ea1c73b988582caf10a22ad907/data_designer_engine-0.9.1-py3-none-any.whl", hash = "sha256:df6017f4623d696d8075b33fd3ab5b76dfda0e4cd623c109b8497ae46abfb918", size = 706028, upload-time = "2026-08-11T20:24:16.171Z" }, ] [[package]] @@ -548,7 +548,7 @@ dependencies = [ [package.metadata] requires-dist = [ - { name = "data-designer", specifier = ">=0.9.0" }, + { name = "data-designer", specifier = ">=0.9.1" }, { name = "mcp", specifier = ">=1.29.0,<2" }, { name = "nltk", specifier = ">=3.10.2,<3.11" }, { name = "pyarrow", specifier = ">=24.0.0,<25" },