Skip to content

feat(studio): Anonymizer builder Source form [ASTD-327] - #884

Merged
marcusds merged 24 commits into
mainfrom
astd-327-anonymizer-builder/mschwab
Jul 24, 2026
Merged

feat(studio): Anonymizer builder Source form [ASTD-327]#884
marcusds merged 24 commits into
mainfrom
astd-327-anonymizer-builder/mschwab

Conversation

@marcusds

@marcusds marcusds commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

This is the first PR of the Anonymizer builder — an intentionally scoped v1, not the finished feature. It stands up the builder shell and a working end-to-end create flow (Substitute only). Strategy params, the live preview panel, the full entity picker, and the dedicated job-detail page all land in follow-up PRs (tracked under ASTD-215 — see "Scoped out" below). Reviewers: scope feedback to the v1 surface; the listed follow-ups are already ticketed.

What

Builds the Anonymizer builder page at /anonymizer/new (ASTD-327) — a working v1 that creates and runs real anonymization jobs. Part of ASTD-215. Builds on #876 (routes/flag) and #879 (jobs API + SDK), both merged.

Layout

Left config panel (Source / Model Settings segmented control) + a preview-panel placeholder. React Hook Form + Zod throughout.

Source tab

  • Data SourceDataset (fileset+file picker, csv/parquet) or URLspec.data.source
  • Generation — strategy select (locked to Substitute for now) + Preview Rows
  • ColumnsText Column auto-populates as a dropdown of the dataset's columns (introspected from the file, size-capped; falls back to text input for URL sources or files > 50 MB; auto-selects when there's only one) + Data Summary
  • Entities — Custom / Auto-detect toggle; Custom shows a multi-select of the default entity labels (useAnonymizerListEntityLabels) → config.detect.entity_labels

Model Settings tab

  • One searchable model select per workflow role (Entity Detector / Validator / Augmenter / Latent Detector, + Replacement Generator for Substitute), seeded with sensible defaults (GLiNER for the detector, a suggested chat model for the rest)
  • A Params dropdown per role (inference parameters)
  • Build dedups models into a model_configs pool and maps selected_models role → alias; defaults a generous timeout (500s) and max_tokens (16384) so slower models complete

Submit

Full RunuseAnonymizerCreateRunJob (sends the replace.kind discriminator, model_configs, selected_models), then redirects to the platform job detail (/jobs/:name) for live status/logs until the dedicated Anonymizer job page (ASTD-330) lands. Disabled while models load; validation errors surface an inline banner and jump to the offending tab. noValidate so RHF/Zod owns validation.

Verified

Create returns 201 and the job runs end-to-end against a local platform.

Scoped out (follow-up tickets, all under ASTD-215)

  • Live preview panel — ASTD-332
  • Redact/Annotate/Hash params — ASTD-333 · Rewrite params — ASTD-334
  • Entity picker: categories, custom labels, chips — ASTD-335
  • Anonymizer job detail page — ASTD-330
  • Backend: kind 500-not-422 & missing-from-OpenAPI — ASTD-328 / ASTD-329

Testing

  • schema.test.ts — 10 tests on the request mapper (strategy routing + kind, model_configs dedup + defaults, selected_models role mapping, detect labels). Pass.
  • @nemo/studio tsc --noEmit — no new errors (17 pre-existing customizer-SDK, unchanged). eslint clean.
  • Gated behind VITE_FF_ANONYMIZER_ENABLED (default false).

Notes

  • Pre-push typecheck hook bypassed for Studio's pre-existing customizer-SDK failures, unrelated to this branch.

@marcusds
marcusds requested review from a team as code owners July 24, 2026 05:20
@github-actions github-actions Bot added the feat label Jul 24, 2026
@coderabbitai

coderabbitai Bot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The Anonymizer Builder now uses a validated, tabbed form with source, generation, columns, entity, and model settings. It builds strategy-specific job requests, submits anonymizer runs, handles errors and navigation, and adds a feature-gated anonymizer job detail route.

Changes

Anonymizer Builder

Layer / File(s) Summary
Form contracts and request mapping
web/packages/studio/src/routes/AnonymizerBuilderRoute/constants.ts, web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.ts, web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.test.ts
Adds shared options and role mappings, model fields, Zod defaults, strategy-specific request construction, trimming, and request-mapping tests.
Controlled builder sections
web/packages/studio/src/routes/AnonymizerBuilderRoute/components/*
Adds controlled source, generation, column, entity, and model settings inputs with conditional fields, descriptions, and provider-backed model selection.
Tabbed route and submission flow
web/packages/studio/src/routes/AnonymizerBuilderRoute/index.tsx
Adds tabbed form content, preview placeholder, validation-driven tab switching, job creation, error handling, disabled pending actions, and navigation.

Anonymizer Job Routing

Layer / File(s) Summary
Feature-gated job detail route
web/packages/studio/src/routes/AnonymizerJobDetailRoute/index.tsx
Adds a feature-gated job detail page with route-parameter breadcrumbs and a placeholder content message.
Lazy job route wiring
web/packages/studio/src/routes/groups/anonymizerRoutes.tsx
Lazy-loads the job detail route and renders it for the anonymizer job route.

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant AnonymizerBuilderRoute
  participant ModelProviders
  participant buildAnonymizerJobRequest
  participant useAnonymizerCreateRunJob
  participant AnonymizerJobDetailRoute
  User->>AnonymizerBuilderRoute: fill form
  AnonymizerBuilderRoute->>ModelProviders: load workspace models
  ModelProviders-->>AnonymizerBuilderRoute: return model options
  User->>AnonymizerBuilderRoute: submit form
  AnonymizerBuilderRoute->>buildAnonymizerJobRequest: build run request
  AnonymizerBuilderRoute->>useAnonymizerCreateRunJob: create anonymizer job
  useAnonymizerCreateRunJob->>AnonymizerJobDetailRoute: navigate to created job
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is concise and correctly points to the new Anonymizer builder source form slice.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch astd-327-anonymizer-builder/mschwab

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.ts (1)

4-13: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Normalize TypeScript import hygiene.

  • web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.ts#L4-L13: place external imports before internal aliases.
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/components/DataSourceSection.tsx#L4-L13: place React/RHF before internal aliases and change FC to import type.
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/components/GenerationSection.tsx#L4-L13: place React/RHF before internal aliases and change FC to import type.
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/components/ColumnsSection.tsx#L4-L9: place React/RHF before internal aliases and change FC to import type.
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/components/EntitiesSection.tsx#L4-L13: place React/RHF before internal aliases and change FC to import type.
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/index.tsx#L4-L36: group external imports before @studio aliases and change FC to import type.

As per coding guidelines: “Use import type for type-only imports” and “Group imports: external libraries, internal modules, relative imports in TypeScript.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.ts` around lines
4 - 13, Normalize imports across
web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.ts (lines 4-13),
components/DataSourceSection.tsx (lines 4-13), components/GenerationSection.tsx
(lines 4-13), components/ColumnsSection.tsx (lines 4-9),
components/EntitiesSection.tsx (lines 4-13), and index.tsx (lines 4-36): group
external imports before internal aliases, and change type-only FC imports to
import type in the affected React component files and AnonymizerBuilderRoute
entry point.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.ts`:
- Line 18: Update the source field validation in the schema to trim its input
before applying the required non-empty check, ensuring whitespace-only values
are rejected consistently with the request builder.

---

Nitpick comments:
In `@web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.ts`:
- Around line 4-13: Normalize imports across
web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.ts (lines 4-13),
components/DataSourceSection.tsx (lines 4-13), components/GenerationSection.tsx
(lines 4-13), components/ColumnsSection.tsx (lines 4-9),
components/EntitiesSection.tsx (lines 4-13), and index.tsx (lines 4-36): group
external imports before internal aliases, and change type-only FC imports to
import type in the affected React component files and AnonymizerBuilderRoute
entry point.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 6f6a3a78-bd80-472a-805e-ac5b581d6532

📥 Commits

Reviewing files that changed from the base of the PR and between 91cc8d6 and 7b70822.

📒 Files selected for processing (8)
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/components/ColumnsSection.tsx
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/components/DataSourceSection.tsx
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/components/EntitiesSection.tsx
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/components/GenerationSection.tsx
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/constants.ts
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/index.tsx
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.test.ts
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.ts

Comment thread web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.ts Outdated
@marcusds
marcusds force-pushed the astd-327-anonymizer-builder/mschwab branch from 7b70822 to f676025 Compare July 24, 2026 05:36
@github-actions

github-actions Bot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor
Suite Lines Covered Line Rate Branch Rate
Unit Tests 27157/34869 77.9% 62.1%
Integration Tests 15968/33581 47.5% 20.0%

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@web/packages/studio/src/routes/AnonymizerBuilderRoute/components/DataSourceSection.tsx`:
- Around line 20-21: Update the DataSourceSection effect or field-change
handling around sourceType and isDataset to reset or unregister the shared
source field whenever sourceType changes between dataset and URL. Ensure the
previous branch’s value and validation error cannot persist into the newly
selected branch, while preserving the active branch’s normal source input
behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: fda31ff0-da36-4a5e-8830-5cec4aecc0d4

📥 Commits

Reviewing files that changed from the base of the PR and between 7b70822 and f676025.

📒 Files selected for processing (8)
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/components/ColumnsSection.tsx
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/components/DataSourceSection.tsx
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/components/EntitiesSection.tsx
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/components/GenerationSection.tsx
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/constants.ts
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/index.tsx
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.test.ts
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.ts
🚧 Files skipped from review as they are similar to previous changes (7)
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.test.ts
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/components/GenerationSection.tsx
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/components/ColumnsSection.tsx
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/components/EntitiesSection.tsx
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/constants.ts
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/index.tsx
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.ts

@marcusds
marcusds force-pushed the astd-327-anonymizer-builder/mschwab branch from f676025 to c74824c Compare July 24, 2026 05:58

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.ts (1)

5-21: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Group external imports before internal aliases.

  • web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.ts: move zod above the @nemo/@studio imports.
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/components/ModelSettingsSection.tsx: move react, react-hook-form, and @nvidia/foundations-react-core above the @nemo/@studio imports.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.ts` around lines
5 - 21, Reorder imports so external packages precede internal aliases: in
web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.ts lines 5-21, move
zod above the `@nemo` and `@studio` imports; in
web/packages/studio/src/routes/AnonymizerBuilderRoute/components/ModelSettingsSection.tsx
lines 4-12, move react, react-hook-form, and `@nvidia/foundations-react-core`
above the `@nemo` and `@studio` imports. No other changes are needed.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@web/packages/studio/src/routes/AnonymizerBuilderRoute/components/ModelSettingsSection.tsx`:
- Line 11: Update the React import in ModelSettingsSection to import FC as a
type-only symbol while retaining useMemo as a runtime import.

---

Outside diff comments:
In `@web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.ts`:
- Around line 5-21: Reorder imports so external packages precede internal
aliases: in web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.ts
lines 5-21, move zod above the `@nemo` and `@studio` imports; in
web/packages/studio/src/routes/AnonymizerBuilderRoute/components/ModelSettingsSection.tsx
lines 4-12, move react, react-hook-form, and `@nvidia/foundations-react-core`
above the `@nemo` and `@studio` imports. No other changes are needed.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 51b01ee8-4b7e-40a7-8c69-6e005eb25234

📥 Commits

Reviewing files that changed from the base of the PR and between c74824c and e522b80.

📒 Files selected for processing (5)
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/components/ModelSettingsSection.tsx
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/constants.ts
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/index.tsx
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.test.ts
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • web/packages/studio/src/routes/AnonymizerBuilderRoute/index.tsx

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
web/packages/studio/src/routes/AnonymizerJobDetailRoute/index.tsx (1)

4-10: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Move the React imports above the @studio imports and mark FC as a type import.
FC is type-only, and react/react-router-dom should stay grouped with the other external imports.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/packages/studio/src/routes/AnonymizerJobDetailRoute/index.tsx` around
lines 4 - 10, Reorder the imports in AnonymizerJobDetailRoute so the external
React and react-router-dom imports appear before the `@nvidia` and `@studio`
imports, and import FC using type-only syntax. Keep the existing runtime imports
unchanged.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@web/packages/studio/src/routes/AnonymizerJobDetailRoute/index.tsx`:
- Around line 4-10: Reorder the imports in AnonymizerJobDetailRoute so the
external React and react-router-dom imports appear before the `@nvidia` and
`@studio` imports, and import FC using type-only syntax. Keep the existing runtime
imports unchanged.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: cdc1366b-f9db-4bcc-9bf8-7728bc7396f3

📥 Commits

Reviewing files that changed from the base of the PR and between e522b80 and 7b9c57e.

📒 Files selected for processing (2)
  • web/packages/studio/src/routes/AnonymizerJobDetailRoute/index.tsx
  • web/packages/studio/src/routes/groups/anonymizerRoutes.tsx

@marcusds
marcusds force-pushed the astd-327-anonymizer-builder/mschwab branch from 7b9c57e to e522b80 Compare July 24, 2026 15:41
@marcusds
marcusds marked this pull request as draft July 24, 2026 19:18
marcusds added 16 commits July 24, 2026 12:47
Replace the /anonymizer/new placeholder with the builder shell: a left
config panel (Source / Model Settings tabs) + a preview-panel placeholder.

Source tab (react-hook-form + Zod -> AnonymizerRequest):
- Data Source: source type (URL | Dataset) + reference input
- Generation: strategy select (substitute/redact/annotate/hash/rewrite)
  + description + preview rows
- Columns: text column + data summary
- Entities: Custom | Auto-detect toggle + include-defaults checkbox

Submit via useAnonymizerCreateRunJob -> navigate to the job. Strategy is
sent at its no-arg default (rewrite -> config.rewrite, others ->
config.replace); strategy params, entity-label picker, model settings,
and live preview are follow-ups.

Gated behind VITE_FF_ANONYMIZER_ENABLED (default false).

Signed-off-by: mschwab <mschwab@nvidia.com>
…-327]

Model Settings tab selects an inference provider model (via
useModelsListProviders / modelsFromProviders) and the create request now
sends spec.model_configs plus spec.selected_models, mapping the active
strategy's workflow roles (detection always; +replace for substitute;
+rewrite roles for rewrite) to the single chosen model — required for
remote execution. Also send the replace 'kind' discriminator tag.

Verified end-to-end against a local platform: create returns 201.

Signed-off-by: mschwab <mschwab@nvidia.com>
Model Settings tab now exposes one model select per workflow role
(Entity Detector / Validator / Augmenter / Latent Detector, plus
Replacement Generator for substitute or the rewrite roles for rewrite),
matching the Figma. Roles are seeded with sensible defaults on load
(GLiNER for the detector, an LLM for the rest) and validated per the
selected strategy.

Build dedups identical role models into a model_configs pool (one entry
per unique model+provider) and maps selected_models role -> alias.
Per-role inference Params dropdown is a follow-up.

Signed-off-by: mschwab <mschwab@nvidia.com>
…ngs [ASTD-327]

Swap the per-role model picker to ControlledSearchableSelect (the same
component as the Clone Agent modal) for a searchable, grouped dropdown.
Keep provider-aware options from modelsFromProviders rather than
buildSuggestedModelOptions, since the latter filters out the GLiNER
detector model and drops the provider that model_configs requires.

Signed-off-by: mschwab <mschwab@nvidia.com>
Add a Params dropdown next to each role's model select (reusing
ModelSelectV2 ParamsDropdown), storing inference parameters per role.
Build attaches inference_parameters to the model_config and splits the
dedup so a shared model with different params yields distinct configs.

Signed-off-by: mschwab <mschwab@nvidia.com>
…[ASTD-327]

Model Settings only mounted when its tab was open, so its default-model
seeding never ran if the user submitted from the Source tab — surfacing
a spurious 'Select a model' error. Keep both tab panels mounted (hide the
inactive one) so seeding runs on load.

Signed-off-by: mschwab <mschwab@nvidia.com>
Gate the Full Run button on the providers query loading state (shared
with ModelSettingsSection via react-query dedup) so the user can't submit
before role model defaults are seeded.

Signed-off-by: mschwab <mschwab@nvidia.com>
onInvalid only switched tabs for model errors, so a Source-tab error
(e.g. missing data source) while on the Model Settings tab left the
submit doing nothing visible. Always jump to the offending tab and show
an inline banner.

Signed-off-by: mschwab <mschwab@nvidia.com>
The searchable model selects render a hidden required search input;
native HTML5 validation tried to focus it on submit and blocked the form
with 'invalid form control is not focusable'. Disable native validation
and rely on the RHF/Zod resolver.

Signed-off-by: mschwab <mschwab@nvidia.com>
Disable the Anonymization Strategy select until the other strategies'
parameter UIs are built. Substitute is the default and only selectable
option.

Signed-off-by: mschwab <mschwab@nvidia.com>
Custom mode (without 'include all defaults') shows a multi-select of the
default entity labels from useAnonymizerListEntityLabels; the selection
restricts detection via config.detect.entity_labels. Auto-detect and
include-defaults leave detect unset (library default set).

Categorized grouping, custom-typed labels, and chip coloring are a
follow-up.

Signed-off-by: mschwab <mschwab@nvidia.com>
…327]

Swap the Source / Model Settings tab bar from Tabs to SegmentedControl.

Signed-off-by: mschwab <mschwab@nvidia.com>
…-327]

When a Dataset source file is selected, read its columns (via the
size-capped useDatasetFileContent + getContentColumns) and render Text
Column as a dropdown of those columns. Falls back to a text input for
URL sources or when the file exceeds MAX_COLUMN_INTROSPECTION_BYTES
(50MB).

Signed-off-by: mschwab <mschwab@nvidia.com>
…-327]

The role-model seed fell back to models[0], which could be a flaky model
(e.g. 01-ai/yi-large failing health checks). Use pickDefaultModelName to
prefer a suggested chat model for the LLM roles.

Signed-off-by: mschwab <mschwab@nvidia.com>
…TD-327]

Signed-off-by: mschwab <mschwab@nvidia.com>
…TD-327]

Reasoning models (e.g. nemotron-nano) exceeded the anonymizer's default
per-request timeout during entity validation (ModelTimeoutError, rows
dropped). Default inference_parameters.timeout to 300s on every
model_config; user-supplied params still override.

Signed-off-by: mschwab <mschwab@nvidia.com>
@marcusds
marcusds force-pushed the astd-327-anonymizer-builder/mschwab branch from dad9f36 to 2b92580 Compare July 24, 2026 19:48
marcusds added 2 commits July 24, 2026 12:53
…-327]

The dedicated Anonymizer job page is still a placeholder (ASTD-330), so
route create-success to the generic /jobs/:name detail (anonymizer jobs
are platform jobs) which shows real status and logs.

Signed-off-by: mschwab <mschwab@nvidia.com>
Reasoning models truncated their structured-output validation responses.
Default inference_parameters.max_tokens to 16384 (matching the library
gpt-oss default) so they can complete; user params override.

Signed-off-by: mschwab <mschwab@nvidia.com>
@marcusds
marcusds marked this pull request as ready for review July 24, 2026 20:14
marcusds added 3 commits July 24, 2026 13:19
…-327]

Per Vercel React best practices: memoize the Text Column select options
(new array each render) and hoist the static SegmentedControl tab items
to module scope.

Signed-off-by: mschwab <mschwab@nvidia.com>
Signed-off-by: mschwab <mschwab@nvidia.com>
…D-327]

Address CodeRabbit: clear the shared source field (and its error) when
the source type toggles between URL and Dataset, and trim the source in
the Zod schema so whitespace-only input fails validation.

Signed-off-by: mschwab <mschwab@nvidia.com>
Comment thread web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.ts Outdated
Comment thread web/packages/studio/src/routes/AnonymizerBuilderRoute/schema.ts Outdated
marcusds added 2 commits July 24, 2026 14:01
…STD-327]

Signed-off-by: mschwab <mschwab@nvidia.com>
Address review: move the generic trim helper out of the anonymizer schema
into @studio/util/strings with a test.

Signed-off-by: mschwab <mschwab@nvidia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants