Skip to content

feat(experiments): Create Pareto chart view#882

Merged
shanaiabuggy merged 13 commits into
mainfrom
sbuggy/ase-682
Jul 24, 2026
Merged

feat(experiments): Create Pareto chart view#882
shanaiabuggy merged 13 commits into
mainfrom
sbuggy/ase-682

Conversation

@shanaiabuggy

@shanaiabuggy shanaiabuggy commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

https://www.loom.com/share/43716ee8bde241a1aeb186be5a5d4384

Summary by CodeRabbit

  • New Features
    • Added an Experiment Group Pareto scatter chart with selectable X/Y metrics, persisted per-group “Pareto view” toggle.
    • Added chart-ready Pareto configuration support to Experiment Group APIs (request/response) and a new endpoint to fetch a group’s Pareto view.
    • Added RL Jobs API endpoints for create/list/results/logs/status, including download and cancellation.
  • Bug Fixes
    • Improved handling of legacy/absent Pareto settings with sensible defaults.
    • Added configurable streaming response aggregation for agent outputs.
  • Documentation
    • Updated OpenAPI specs and static authorization for the new Pareto endpoint.
  • Tests
    • Added integration and unit tests covering Pareto defaults, persistence, and frontier calculations.

@shanaiabuggy
shanaiabuggy requested review from a team as code owners July 24, 2026 00:10
@github-actions github-actions Bot added the feat label Jul 24, 2026
@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 15966/33581 47.5% 20.0%

@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

Changes

Experiment Group Pareto

Layer / File(s) Summary
Pareto contracts and persistence
openapi/..., services/intake/src/nmp/intake/entities/..., services/intake/src/nmp/intake/api/v2/experiments/schemas.py
Adds Pareto configuration, defaults, response mapping, and legacy-value fallback handling.
Pareto persistence and authorization
services/intake/src/nmp/intake/api/v2/experiments/endpoints.py, services/core/auth/..., services/intake/tests/integration/...
Persists Pareto settings, authorizes the Pareto endpoint, and verifies default and custom round trips.
Pareto chart and view integration
web/packages/studio/src/components/charts/ExperimentGroupParetoChart/*, web/packages/studio/src/components/dataViews/..., web/packages/studio/src/routes/...
Loads evaluations, derives metrics, computes frontier points, renders the chart, persists axes, tests utilities, and adds a visibility toggle.

RL Jobs API

Layer / File(s) Summary
RL job paths and operation wiring
plugins/nemo-customizer/openapi/openapi.yaml
Adds RL job operations and connects them to RL-specific schemas while retaining Unsloth paths.
RL job contracts
plugins/nemo-customizer/openapi/openapi.yaml
Adds RL training, job, output, pagination, optimizer, parallelism, and status schemas.

Deployment volume configuration

Layer / File(s) Summary
Docker volume initialization fields
plugins/nemo-deployments/openapi/openapi.yaml
Adds initChmod and initImage to DockerVolumeConfig.

Evaluator streaming aggregation

Layer / File(s) Summary
Streaming response aggregation
plugins/nemo-evaluator/openapi/openapi.yaml
Adds last/concat response aggregation fields and updates streaming response-path documentation.

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant ExperimentGroupDetailRoute
  participant ExperimentGroupDataView
  participant ExperimentGroupParetoChart
  participant useListEvaluations
  User->>ExperimentGroupDetailRoute: toggle Pareto view
  ExperimentGroupDetailRoute->>ExperimentGroupDataView: pass paretoVisible
  ExperimentGroupDataView->>ExperimentGroupParetoChart: render chart
  ExperimentGroupParetoChart->>useListEvaluations: load group evaluations
  useListEvaluations-->>ExperimentGroupParetoChart: evaluation rows
  ExperimentGroupParetoChart-->>User: scatter plot and frontier
Loading

Suggested reviewers: briannewsom

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 60.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main change: adding a Pareto chart view for experiments.
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.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch sbuggy/ase-682

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: 4

🤖 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 `@plugins/nemo-deployments/openapi/openapi.yaml`:
- Around line 973-983: Update the OpenAPI schema relationship between initChmod
and initImage so configurations that set initImage must also provide initChmod,
while preserving their existing types and descriptions. Add the same dependency
validation to DockerVolumeConfig, ensuring image-only configurations are
rejected before deployment.
- Around line 973-979: Restrict the initChmod property in the OpenAPI schema to
valid chmod mode strings, such as exactly three or four octal digits (for
example, 0777), using the schema’s pattern validation. Keep the existing string
type and description while ensuring malformed values are rejected before volume
creation.

In
`@web/packages/studio/src/components/charts/ExperimentGroupParetoChart/index.tsx`:
- Around line 140-154: Update ExperimentGroupParetoChart so xMetricId and
yMetricId reset when group.id changes, using the incoming group.pareto values
with the existing defaults. Add the synchronization in the component state flow
without changing the optimistic updates or persistence behavior.

In
`@web/packages/studio/src/components/dataViews/ExperimentGroupDataView/index.tsx`:
- Around line 494-515: Add an accessible name to the Pareto toggle Button in the
paretoVisible control, using an aria-label that clearly identifies the
action/state when its hide-mobile text is not rendered. Preserve the existing
aria-pressed behavior and visible label switching.
🪄 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: 8b7cc2bb-d0e4-40cd-a0c9-cddd4567e004

📥 Commits

Reviewing files that changed from the base of the PR and between 97d5e6c and 5a8e59b.

⛔ Files ignored due to path filters (16)
  • sdk/python/nemo-platform/.nmpcontext/openapi.yaml is excluded by !sdk/**
  • sdk/python/nemo-platform/.nmpcontext/stainless.yaml is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/experiment_groups/api.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/experiment_groups/experiment_groups.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/experiment_group_create_params.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/experiment_group_response.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/experiment_group_update_params.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/pareto_config.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/pareto_config_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/pareto_data_response.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/pareto_metric_point.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/inference/container_executor_config.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/inference/container_executor_config_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/api_resources/test_experiment_groups.py is excluded by !sdk/**
  • sdk/stainless.yaml is excluded by !sdk/**
📒 Files selected for processing (15)
  • openapi/ga/individual/platform.openapi.yaml
  • openapi/ga/openapi.yaml
  • openapi/openapi.yaml
  • plugins/nemo-customizer/openapi/openapi.yaml
  • plugins/nemo-deployments/openapi/openapi.yaml
  • plugins/nemo-evaluator/openapi/openapi.yaml
  • services/core/auth/src/nmp/core/auth/assets/static-authz.yaml
  • services/intake/src/nmp/intake/api/v2/experiments/endpoints.py
  • services/intake/src/nmp/intake/api/v2/experiments/schemas.py
  • services/intake/src/nmp/intake/entities/experiments.py
  • services/intake/tests/integration/test_experiments_crud.py
  • web/packages/studio/src/components/charts/ExperimentGroupParetoChart/index.tsx
  • web/packages/studio/src/components/charts/ExperimentGroupParetoChart/paretoMetrics.test.ts
  • web/packages/studio/src/components/charts/ExperimentGroupParetoChart/paretoMetrics.ts
  • web/packages/studio/src/components/dataViews/ExperimentGroupDataView/index.tsx

Comment thread plugins/nemo-deployments/openapi/openapi.yaml
Comment thread plugins/nemo-deployments/openapi/openapi.yaml
Comment thread web/packages/studio/src/components/dataViews/ExperimentGroupDataView/index.tsx Outdated
shanaiabuggy and others added 4 commits July 24, 2026 09:20
Signed-off-by: shanaiabuggy <[email protected]>
Signed-off-by: shanaiabuggy <[email protected]>
Signed-off-by: shanaiabuggy <[email protected]>
…hange

- Remove the now-unused ChartScatter import from ExperimentGroupDataView (the
  toggle moved to ExperimentGroupDetailRoute), fixing the Web lint + typecheck
  CI failures.
- Key ExperimentGroupParetoChart by group.id so the axis selection re-seeds from
  the new group's saved config when navigating between groups without a route
  remount (CodeRabbit: axes could otherwise persist and be saved onto the wrong
  group).

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Signed-off-by: shanaiabuggy <[email protected]>

@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: 2

🤖 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 `@services/intake/src/nmp/intake/api/v2/experiments/schemas.py`:
- Around line 51-54: Update ParetoConfig validation for x_metric and y_metric so
values are restricted to cost_usd, latency_ms, or the evaluators.<name> pattern
while preserving dynamic evaluator names. Reject unsupported identifiers before
the configuration is persisted, and keep the existing default ParetoConfig
behavior unchanged.
- Around line 51-54: Update the ExperimentGroupRequest/Pareto configuration
handling so omitted pareto values remain distinguishable from explicitly
supplied defaults during updates. Ensure the update endpoint preserves
existing.pareto when the request omits this field, while still applying an
explicitly provided ParetoConfig; use a separate update schema or an equivalent
optional-field approach.
🪄 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: 280fa26c-bbc6-49ff-b524-43789f0b2cc5

📥 Commits

Reviewing files that changed from the base of the PR and between 2178bea and ad249a1.

⛔ Files ignored due to path filters (16)
  • sdk/python/nemo-platform/.nmpcontext/openapi.yaml is excluded by !sdk/**
  • sdk/python/nemo-platform/.nmpcontext/stainless.yaml is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/experiment_groups/api.md is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/resources/experiment_groups/experiment_groups.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/__init__.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/experiment_group_create_params.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/experiment_group_response.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/experiment_group_update_params.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/pareto_config.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/pareto_config_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/pareto_data_response.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/pareto_metric_point.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/inference/container_executor_config.py is excluded by !sdk/**
  • sdk/python/nemo-platform/src/nemo_platform/types/inference/container_executor_config_param.py is excluded by !sdk/**
  • sdk/python/nemo-platform/tests/api_resources/test_experiment_groups.py is excluded by !sdk/**
  • sdk/stainless.yaml is excluded by !sdk/**
📒 Files selected for processing (16)
  • openapi/ga/individual/platform.openapi.yaml
  • openapi/ga/openapi.yaml
  • openapi/openapi.yaml
  • plugins/nemo-customizer/openapi/openapi.yaml
  • plugins/nemo-deployments/openapi/openapi.yaml
  • plugins/nemo-evaluator/openapi/openapi.yaml
  • services/core/auth/src/nmp/core/auth/assets/static-authz.yaml
  • services/intake/src/nmp/intake/api/v2/experiments/endpoints.py
  • services/intake/src/nmp/intake/api/v2/experiments/schemas.py
  • services/intake/src/nmp/intake/entities/experiments.py
  • services/intake/tests/integration/test_experiments_crud.py
  • web/packages/studio/src/components/charts/ExperimentGroupParetoChart/index.tsx
  • web/packages/studio/src/components/charts/ExperimentGroupParetoChart/paretoMetrics.test.ts
  • web/packages/studio/src/components/charts/ExperimentGroupParetoChart/paretoMetrics.ts
  • web/packages/studio/src/components/dataViews/ExperimentGroupDataView/index.tsx
  • web/packages/studio/src/routes/ExperimentGroupDetailRoute/index.tsx
🚧 Files skipped from review as they are similar to previous changes (14)
  • services/intake/src/nmp/intake/entities/experiments.py
  • services/core/auth/src/nmp/core/auth/assets/static-authz.yaml
  • plugins/nemo-deployments/openapi/openapi.yaml
  • plugins/nemo-evaluator/openapi/openapi.yaml
  • web/packages/studio/src/routes/ExperimentGroupDetailRoute/index.tsx
  • web/packages/studio/src/components/charts/ExperimentGroupParetoChart/paretoMetrics.ts
  • web/packages/studio/src/components/charts/ExperimentGroupParetoChart/index.tsx
  • openapi/openapi.yaml
  • openapi/ga/individual/platform.openapi.yaml
  • web/packages/studio/src/components/charts/ExperimentGroupParetoChart/paretoMetrics.test.ts
  • services/intake/tests/integration/test_experiments_crud.py
  • services/intake/src/nmp/intake/api/v2/experiments/endpoints.py
  • openapi/ga/openapi.yaml
  • plugins/nemo-customizer/openapi/openapi.yaml

Comment thread services/intake/src/nmp/intake/api/v2/experiments/schemas.py Outdated
Comment thread services/intake/src/nmp/intake/api/v2/experiments/endpoints.py Outdated
shanaiabuggy and others added 6 commits July 24, 2026 09:59
Signed-off-by: shanaiabuggy <[email protected]>
Signed-off-by: shanaiabuggy <[email protected]>
Signed-off-by: shanaiabuggy <[email protected]>
Signed-off-by: shanaiabuggy <[email protected]>
…pdates

Address CodeRabbit review on PR #882:
- Restrict ParetoConfig x/y metrics to cost_usd, latency_ms, or evaluators.<name>
  so invalid identifiers can't be persisted as unusable chart defaults.
- Make ExperimentGroupRequest.pareto optional so an update that omits it keeps the
  saved axes instead of resetting them to the cost/latency default.
- Regenerate the OpenAPI spec; add tests covering rejection and preservation.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Signed-off-by: shanaiabuggy <[email protected]>

@BrianNewsom BrianNewsom 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.

Backend changes look good once the build is successful!

@shanaiabuggy
shanaiabuggy added this pull request to the merge queue Jul 24, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Jul 24, 2026
@shanaiabuggy
shanaiabuggy enabled auto-merge July 24, 2026 20:38
@shanaiabuggy
shanaiabuggy added this pull request to the merge queue Jul 24, 2026
Merged via the queue into main with commit 0c79158 Jul 24, 2026
58 checks passed
@shanaiabuggy
shanaiabuggy deleted the sbuggy/ase-682 branch July 24, 2026 21:06
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.

3 participants