> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.nvidia.com/nemo-helix/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.nvidia.com/nemo-helix/_mcp/server.

# Data Designer SDK Resources

The `data_designer.config` module provides a consistent, context-agnostic experience for building Data Designer configs.
Once you are ready to execute that config through NeMo Services APIs, you use objects from the `nemo_platform` SDK.
This page explains the SDK objects used for Data Designer API execution.

## DataDesignerResource

The `DataDesignerResource` is the initial SDK object for working with Data Designer through the SDK.
It provides Data Designer API preview and create operations for Data Designer configurations.

A `DataDesignerResource` is accessed directly from a `NeMoPlatform` instance:

```python
import os
from nemo_platform import NeMoPlatform

client = NeMoPlatform(
    base_url=os.environ.get("NMP_BASE_URL", "http://localhost:8080"),
    workspace="default",
)
data_designer = client.data_designer  # this object is a DataDesignerResource
```

The `DataDesignerResource` is primarily used to make Data Designer API preview requests (`preview`) and create jobs (`create`),
but exposes some additional useful methods:

| Method                                        | Description                                                                                                                               |
| --------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| `validate(config_builder, *, workspace=None)` | Checks a configuration and returns a `ValidationReport` (see below).                                                                      |
| `get_default_model_providers()`               | Returns a list of model providers registered with the Models API and Inference Gateway API that can be used in your Data Designer config. |
| `get_job_resource(job_name: str)`             | Returns a `DataDesignerJobResource` for interacting with a job (see below).                                                               |

### Validating a config

`validate()` runs the same checks `preview()` and `create()` perform internally, but never short-circuits — every detectable problem appears in one report. Use it to catch configuration errors before submitting work.

```python
import data_designer.config as dd

config_builder = dd.DataDesignerConfigBuilder(
    model_configs=[
        dd.ModelConfig(
            provider="default/nvidia-build",
            model="nvidia/nemotron-3-nano-30b-a3b",
            alias="text",
        )
    ],
)
# Add columns, constraints, seed datasets, processors, and profilers here.

report = client.data_designer.validate(config_builder)

if not report.ok:
    for error in report.errors:
        print(error.message)
```

The `workspace` keyword argument selects the workspace used to resolve provider references and seed sources. It falls back to the platform client's workspace, then to `"default"`.

```python
report = client.data_designer.validate(config_builder, workspace="my-workspace")
```

## ValidationReport

`validate()` returns a `ValidationReport` describing what the checks found.

| Attribute       | Description                                                                                   |
| --------------- | --------------------------------------------------------------------------------------------- |
| `ok`            | `True` when no errors were found.                                                             |
| `errors`        | A list of `ValidationError` objects, each with a `message` string. Empty when `ok` is `True`. |
| `config_source` | The configuration source path when validation ran through the CLI. `None` for SDK calls.      |

## DataDesignerJobResource

The `DataDesignerJobResource` provides several helper methods for working with a job.
It is returned by the `DataDesignerResource.create()` method when you create a job;
you can also use `DataDesignerResource.get_job_resource()` to get an instance of this object for an existing job.

Some of the most useful methods are described below.

| Method                 | Description                                                                                        |
| ---------------------- | -------------------------------------------------------------------------------------------------- |
| `wait_until_done()`    | Polls the job service until the job reaches a terminal state. Prints job logs along the way.       |
| `get_logs()`           | Returns logs from the job as a list of dicts. Handles pagination automatically.                    |
| `download_artifacts()` | Downloads the job results as a tar archive. Returns a `DataDesignerJobResults` object (see below). |

## DataDesignerJobResults

The `DataDesignerJobResults` object simplifies loading downloaded job results into memory.

| Method                                        | Description                                                                                   |
| --------------------------------------------- | --------------------------------------------------------------------------------------------- |
| `load_analysis()`                             | Returns a `DatasetProfilerResults` object (from the library) with an analysis of the dataset. |
| `load_dataset()`                              | Returns the output dataset as a Pandas DataFrame.                                             |
| `load_processor_dataset(processor_name: str)` | Returns the named processor dataset as a Pandas DataFrame.                                    |