feat(studio): add Insights section with experiment↔insight linking#757
Conversation
|
212499e to
ed458bd
Compare
693069f to
911f8a7
Compare
walston
left a comment
There was a problem hiding this comment.
Looks good enough to me.
aa4ef87 to
487c70a
Compare
📝 WalkthroughWalkthroughThe PR adds insight-linked experiment-group filtering, enriched Insights APIs, a deterministic demo utility, and a feature-gated Studio Optimizer experience with insight details, experiment groups, traces, source links, and evaluation integration. ChangesBackend insight enrichment and filtering
Studio optimizer experience
Sequence Diagram(s)sequenceDiagram
participant Studio
participant InsightsAPI
participant IntakeAPI
participant ClickHouse
Studio->>InsightsAPI: List insights
InsightsAPI->>IntakeAPI: Request latest trace timestamps by group
IntakeAPI->>ClickHouse: Query grouped trace references
ClickHouse-->>IntakeAPI: Latest started_at values
IntakeAPI-->>InsightsAPI: Trace timestamps
InsightsAPI-->>Studio: Enriched insight list
Possibly related PRs
Suggested labels: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (7)
plugins/nemo-insights/scripts/insights_demo.py (1)
480-483: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winDerive the trace count instead of hardcoding 11.
♻️ Compute from the fixture
+ trace_count = sum(len(evaluation.sessions) for evaluation in evaluations) print( f"Seeded workspace '{DEMO_WORKSPACE}' with {len(fixture.insights)} insights, " - f"{len(fixture.groups)} groups, {len(evaluations)} evaluations, and 11 traces." + f"{len(fixture.groups)} groups, {len(evaluations)} evaluations, and {trace_count} traces." )🤖 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 `@plugins/nemo-insights/scripts/insights_demo.py` around lines 480 - 483, Update the seeding summary print statement to derive the trace count from the fixture data instead of hardcoding 11, using the fixture’s existing trace collection and preserving the rest of the message.web/packages/studio/src/routes/WorkspaceLayout/WorkspaceSideNav.tsx (1)
22-64: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueGroup third-party imports before workspace aliases.
web/packages/studio/src/routes/WorkspaceLayout/WorkspaceSideNav.tsx#L22-L64: movelucide-reactandreactbefore@nemo/@studioimports.web/packages/studio/src/routes/optimizer/InsightTracesTable/index.test.tsx#L4-L10: move testing-library and MSW imports before workspace aliases.web/packages/studio/src/components/IntakeLists/IntakeTracesTable.tsx#L11-L25: keep all third-party imports together before aliases.web/packages/studio/src/components/IntakeLists/intakeTraceColumns.tsx#L4-L16: move@nvidia/foundations-react-coreandreactbefore workspace aliases.As per coding guidelines, “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/WorkspaceLayout/WorkspaceSideNav.tsx` around lines 22 - 64, Reorder imports to group third-party dependencies before workspace aliases: in web/packages/studio/src/routes/WorkspaceLayout/WorkspaceSideNav.tsx (lines 22-64), place lucide-react and react before `@nemo/`@studio imports; in web/packages/studio/src/routes/optimizer/InsightTracesTable/index.test.tsx (lines 4-10), place testing-library and MSW imports before aliases; in web/packages/studio/src/components/IntakeLists/IntakeTracesTable.tsx (lines 11-25), keep all third-party imports together before aliases; and in web/packages/studio/src/components/IntakeLists/intakeTraceColumns.tsx (lines 4-16), place `@nvidia/foundations-react-core` and react before workspace aliases.Source: Coding guidelines
web/packages/studio/src/routes/utils.ts (1)
106-108: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd explicit return types to public helpers.
gateOptimizerRoutesshould returnRouteObject[]; both route builders should returnstring.As per coding guidelines, “Use explicit return types for public APIs and complex functions in TypeScript.”
Also applies to: 397-403
🤖 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/utils.ts` around lines 106 - 108, Update the public helper return types: declare gateOptimizerRoutes as returning RouteObject[], and add explicit string return types to both route-builder functions referenced near the additional location. Preserve their existing implementations and behavior.Source: Coding guidelines
web/packages/studio/src/routes/optimizer/InsightTracesTable/index.tsx (1)
38-51: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick winPagination flicker: missing
keepPreviousData.Other tables in this PR (
OptimizerRoute,InsightExperimentGroups) useplaceholderData: keepPreviousDatato avoid a blank/loading flash while paging. ThisuseListTracescall doesn't, so switching trace pages will briefly clear the table.♻️ Suggested fix
const { data, error, isFetching } = useListTraces( workspace, { filter: withOperators<TraceFilter>({ id: { $in: visibleTraceIds } }), mode: 'preview', page: 1, page_size: pageSize, }, { query: { enabled: Boolean(workspace) && visibleTraceIds.length > 0, + placeholderData: keepPreviousData, }, } );Requires importing
keepPreviousDatafrom@tanstack/react-query.🤖 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/optimizer/InsightTracesTable/index.tsx` around lines 38 - 51, Update the useListTraces query options in InsightTracesTable to import and set placeholderData to keepPreviousData, preserving the current trace rows while switching pages and avoiding a loading flicker.web/packages/studio/src/routes/optimizer/OptimizerInsightRoute/index.tsx (1)
136-149: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winNo confirmation before "Delete"/"Resolve" status change.
Both actions call
updateInsightimmediately on click. Per Line 71's comment, only the external agent can move status back toopen— there's no UI path to undo a stray "Delete" click. Consider a confirmation step before firing the mutation.🤖 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/optimizer/OptimizerInsightRoute/index.tsx` around lines 136 - 149, Add a confirmation step to the action handling in OptimizerInsightRoute before invoking updateInsight for Delete or Resolve actions. Ensure the mutation only runs after the user confirms, while preserving immediate handling for other insightActions targets.web/packages/studio/src/api/optimizer.ts (2)
27-65: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winCatch-all index signatures defeat interface typing.
[key: string]: unknownonInsight(Line 44) andInsightPage(Line 64) lets any misspelled property (e.g.insight.staus) type-check silently, since the index signature swallows unknown keys. Consider dropping these and letting TS flag typos/missing fields.🤖 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/api/optimizer.ts` around lines 27 - 65, Remove the catch-all [key: string]: unknown index signatures from the Insight and InsightPage interfaces. Keep all explicitly declared fields unchanged so TypeScript reports misspelled or undeclared properties while preserving the existing API shape.
86-153: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd explicit return types to exported fetcher functions.
optimizerListInsights,optimizerGetInsight, andoptimizerUpdateInsightare public APIs without explicit return type annotations. As per coding guidelines, "Use explicit return types for public APIs and complex functions in TypeScript."♻️ Example fix
-export const optimizerListInsights = ( +export const optimizerListInsights = ( workspace: string, params?: OptimizerListInsightsParams, signal?: AbortSignal -) => +): Promise<InsightPage> => customFetch<InsightPage>({🤖 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/api/optimizer.ts` around lines 86 - 153, Add explicit return type annotations to the exported fetcher functions optimizerListInsights, optimizerGetInsight, and optimizerUpdateInsight, matching the promise/result types returned by their customFetch calls. Leave the query hooks and query-key helpers 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.
Inline comments:
In `@plugins/nemo-insights/scripts/insights_demo.py`:
- Around line 278-285: Update the trace availability probe in the demo request
flow to target the configured demo workspace instead of hardcoded “default”.
Narrow the status handling so only genuine service-unavailable responses map to
the ClickHouse recovery hint, while a missing workspace is handled separately
without reporting ClickHouse as down.
- Line 41: Update _BASE_TIME to derive from the current UTC run time instead of
a fixed calendar date, while preserving deterministic relative offsets used by
the seeded traces and stable session IDs.
---
Nitpick comments:
In `@plugins/nemo-insights/scripts/insights_demo.py`:
- Around line 480-483: Update the seeding summary print statement to derive the
trace count from the fixture data instead of hardcoding 11, using the fixture’s
existing trace collection and preserving the rest of the message.
In `@web/packages/studio/src/api/optimizer.ts`:
- Around line 27-65: Remove the catch-all [key: string]: unknown index
signatures from the Insight and InsightPage interfaces. Keep all explicitly
declared fields unchanged so TypeScript reports misspelled or undeclared
properties while preserving the existing API shape.
- Around line 86-153: Add explicit return type annotations to the exported
fetcher functions optimizerListInsights, optimizerGetInsight, and
optimizerUpdateInsight, matching the promise/result types returned by their
customFetch calls. Leave the query hooks and query-key helpers unchanged.
In `@web/packages/studio/src/routes/optimizer/InsightTracesTable/index.tsx`:
- Around line 38-51: Update the useListTraces query options in
InsightTracesTable to import and set placeholderData to keepPreviousData,
preserving the current trace rows while switching pages and avoiding a loading
flicker.
In `@web/packages/studio/src/routes/optimizer/OptimizerInsightRoute/index.tsx`:
- Around line 136-149: Add a confirmation step to the action handling in
OptimizerInsightRoute before invoking updateInsight for Delete or Resolve
actions. Ensure the mutation only runs after the user confirms, while preserving
immediate handling for other insightActions targets.
In `@web/packages/studio/src/routes/utils.ts`:
- Around line 106-108: Update the public helper return types: declare
gateOptimizerRoutes as returning RouteObject[], and add explicit string return
types to both route-builder functions referenced near the additional location.
Preserve their existing implementations and behavior.
In `@web/packages/studio/src/routes/WorkspaceLayout/WorkspaceSideNav.tsx`:
- Around line 22-64: Reorder imports to group third-party dependencies before
workspace aliases: in
web/packages/studio/src/routes/WorkspaceLayout/WorkspaceSideNav.tsx (lines
22-64), place lucide-react and react before `@nemo/`@studio imports; in
web/packages/studio/src/routes/optimizer/InsightTracesTable/index.test.tsx
(lines 4-10), place testing-library and MSW imports before aliases; in
web/packages/studio/src/components/IntakeLists/IntakeTracesTable.tsx (lines
11-25), keep all third-party imports together before aliases; and in
web/packages/studio/src/components/IntakeLists/intakeTraceColumns.tsx (lines
4-16), place `@nvidia/foundations-react-core` and react before workspace aliases.
🪄 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: f3b497f8-8e61-45b1-be4a-c1c874eb9441
⛔ Files ignored due to path filters (6)
sdk/python/nemo-platform/.nmpcontext/openapi.yamlis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/experiment_groups/experiment_groups.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/experiment_group_filter_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/experiment_group_list_params.pyis excluded by!sdk/**sdk/python/nemo-platform/tests/api_resources/test_experiment_groups.pyis excluded by!sdk/**web/packages/studio/src/assets/voyager.svgis excluded by!**/*.svg
📒 Files selected for processing (58)
openapi/ga/individual/platform.openapi.yamlopenapi/ga/openapi.yamlopenapi/openapi.yamlplugins/nemo-insights/scripts/insights_demo.pyplugins/nemo-insights/src/nemo_insights_plugin/schema.pyplugins/nemo-insights/src/nemo_insights_plugin/service.pyplugins/nemo-insights/tests/test_insights_list_contract.pyservices/intake/src/nmp/intake/api/v2/experiments/endpoints.pyservices/intake/src/nmp/intake/api/v2/experiments/schemas.pyservices/intake/src/nmp/intake/spans/api/query_filters.pyservices/intake/src/nmp/intake/spans/api/traces.pyservices/intake/src/nmp/intake/spans/clickhouse_client.pyservices/intake/src/nmp/intake/spans/domain.pyservices/intake/src/nmp/intake/spans/service.pyservices/intake/src/nmp/intake/spans/trace_repository.pyservices/intake/tests/integration/test_experiments_crud.pyservices/intake/tests/test_traces_api.pyservices/intake/tests/test_traces_clickhouse_repository.pyservices/studio/src/nmp/studio/env_mappings.pyweb/packages/studio/env/.env.dev.local.sampleweb/packages/studio/env/.env.fastapiweb/packages/studio/src/api/optimizer.tsweb/packages/studio/src/components/ChangesetBadge/index.tsxweb/packages/studio/src/components/ExperimentGroupEditModal/index.test.tsxweb/packages/studio/src/components/ExperimentGroupEditModal/index.tsxweb/packages/studio/src/components/IntakeLists/IntakeTracesTable.tsxweb/packages/studio/src/components/IntakeLists/intakeTraceColumns.tsxweb/packages/studio/src/components/OriginatingInsightLink/index.tsxweb/packages/studio/src/components/dataViews/ExperimentGroupDataView/index.tsxweb/packages/studio/src/constants/environment.tsweb/packages/studio/src/constants/featureFlags/featureFlags.tsweb/packages/studio/src/constants/routes.tsweb/packages/studio/src/routes/EvaluationDetailRoute/EvaluationDetailMetrics.tsxweb/packages/studio/src/routes/EvaluationDetailRoute/index.test.tsxweb/packages/studio/src/routes/EvaluationDetailRoute/index.tsxweb/packages/studio/src/routes/EvaluationDetailRoute/optimizerDisabled.test.tsxweb/packages/studio/src/routes/ExperimentGroupDetailRoute/index.test.tsxweb/packages/studio/src/routes/ExperimentGroupDetailRoute/index.tsxweb/packages/studio/src/routes/WorkspaceLayout/WorkspaceSideNav.test.tsxweb/packages/studio/src/routes/WorkspaceLayout/WorkspaceSideNav.tsxweb/packages/studio/src/routes/groups/index.tsweb/packages/studio/src/routes/groups/optimizerRoutes.tsxweb/packages/studio/src/routes/index.test.tsxweb/packages/studio/src/routes/index.tsxweb/packages/studio/src/routes/optimizer/InsightOpenModal/command.tsweb/packages/studio/src/routes/optimizer/InsightOpenModal/index.test.tsweb/packages/studio/src/routes/optimizer/InsightOpenModal/index.tsxweb/packages/studio/src/routes/optimizer/InsightTracesTable/index.test.tsxweb/packages/studio/src/routes/optimizer/InsightTracesTable/index.tsxweb/packages/studio/src/routes/optimizer/OptimizerInsightRoute/InsightExperimentGroups.tsxweb/packages/studio/src/routes/optimizer/OptimizerInsightRoute/index.test.tsxweb/packages/studio/src/routes/optimizer/OptimizerInsightRoute/index.tsxweb/packages/studio/src/routes/optimizer/OptimizerRoute/index.test.tsxweb/packages/studio/src/routes/optimizer/OptimizerRoute/index.tsxweb/packages/studio/src/routes/optimizer/insightStatus.test.tsweb/packages/studio/src/routes/optimizer/insightStatus.tsweb/packages/studio/src/routes/utils.tsweb/packages/studio/src/tests/title-change.test.tsx
Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>
Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>
Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>
Load each visible trace page in one Intake request to avoid per-row API fan-out while preserving evidence order and failure feedback. Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>
Apply repository Prettier formatting so the Studio format check passes. Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>
The insights work replaced the group detail header's description with a static blurb, so the group's editable description was rendered nowhere, and it gave group.summary a permanent panel that reads "—" for every group no producer has summarized. Show the description as the page subtitle again and render the summary panel only when it has content. The group update endpoint is a full replace, so also resend the summary, insight link, and metadata the edit form does not touch; saving a description edit was clearing all three. Move the originating insight link into the insight card's header as a compact mark and label so the description text uses the full card width. Signed-off-by: Aditya Pandey <aditypandey@nvidia.com>
732e3aa to
5d7e38a
Compare
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
services/intake/src/nmp/intake/api/v2/experiments/schemas.py (1)
51-57: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick winNormalize omitted
paretobefore creating the entity.
ExperimentGroupRequest.paretobecomesNonewhen omitted, butcreate_experiment_groupforwards it directly toExperimentGroup. This bypasses the documented create default and can violate the non-nullableExperimentGroupResponse.paretocontract. Normalize it in the create path while preserving the existing update behavior.Suggested fix
- pareto=body.pareto, + pareto=body.pareto if body.pareto is not None else ParetoConfig(),🤖 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 `@services/intake/src/nmp/intake/api/v2/experiments/schemas.py` around lines 51 - 57, Update create_experiment_group to replace an omitted ExperimentGroupRequest.pareto value with the documented cost-versus-latency ParetoConfig before constructing ExperimentGroup. Preserve None for update requests so omitted pareto continues to retain the existing value, and keep the ExperimentGroupResponse.pareto contract non-nullable.
🤖 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.
Outside diff comments:
In `@services/intake/src/nmp/intake/api/v2/experiments/schemas.py`:
- Around line 51-57: Update create_experiment_group to replace an omitted
ExperimentGroupRequest.pareto value with the documented cost-versus-latency
ParetoConfig before constructing ExperimentGroup. Preserve None for update
requests so omitted pareto continues to retain the existing value, and keep the
ExperimentGroupResponse.pareto contract non-nullable.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 86497ff9-29c5-4e06-b139-ad40cb79232b
⛔ Files ignored due to path filters (6)
sdk/python/nemo-platform/.nmpcontext/openapi.yamlis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/resources/experiment_groups/experiment_groups.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/experiment_group_filter_param.pyis excluded by!sdk/**sdk/python/nemo-platform/src/nemo_platform/types/experiment_groups/experiment_group_list_params.pyis excluded by!sdk/**sdk/python/nemo-platform/tests/api_resources/test_experiment_groups.pyis excluded by!sdk/**web/packages/studio/src/assets/voyager.svgis excluded by!**/*.svg
📒 Files selected for processing (58)
openapi/ga/individual/platform.openapi.yamlopenapi/ga/openapi.yamlopenapi/openapi.yamlplugins/nemo-insights/scripts/insights_demo.pyplugins/nemo-insights/src/nemo_insights_plugin/schema.pyplugins/nemo-insights/src/nemo_insights_plugin/service.pyplugins/nemo-insights/tests/test_insights_list_contract.pyservices/intake/src/nmp/intake/api/v2/experiments/endpoints.pyservices/intake/src/nmp/intake/api/v2/experiments/schemas.pyservices/intake/src/nmp/intake/spans/api/query_filters.pyservices/intake/src/nmp/intake/spans/api/traces.pyservices/intake/src/nmp/intake/spans/clickhouse_client.pyservices/intake/src/nmp/intake/spans/domain.pyservices/intake/src/nmp/intake/spans/service.pyservices/intake/src/nmp/intake/spans/trace_repository.pyservices/intake/tests/integration/test_experiments_crud.pyservices/intake/tests/test_traces_api.pyservices/intake/tests/test_traces_clickhouse_repository.pyservices/studio/src/nmp/studio/env_mappings.pyweb/packages/studio/env/.env.dev.local.sampleweb/packages/studio/env/.env.fastapiweb/packages/studio/src/api/optimizer.tsweb/packages/studio/src/components/ChangesetBadge/index.tsxweb/packages/studio/src/components/ExperimentGroupEditModal/index.test.tsxweb/packages/studio/src/components/ExperimentGroupEditModal/index.tsxweb/packages/studio/src/components/IntakeLists/IntakeTracesTable.tsxweb/packages/studio/src/components/IntakeLists/intakeTraceColumns.tsxweb/packages/studio/src/components/OriginatingInsightLink/index.tsxweb/packages/studio/src/components/dataViews/ExperimentGroupDataView/index.tsxweb/packages/studio/src/constants/environment.tsweb/packages/studio/src/constants/featureFlags/featureFlags.tsweb/packages/studio/src/constants/routes.tsweb/packages/studio/src/routes/EvaluationDetailRoute/EvaluationDetailMetrics.tsxweb/packages/studio/src/routes/EvaluationDetailRoute/index.test.tsxweb/packages/studio/src/routes/EvaluationDetailRoute/index.tsxweb/packages/studio/src/routes/EvaluationDetailRoute/optimizerDisabled.test.tsxweb/packages/studio/src/routes/ExperimentGroupDetailRoute/index.test.tsxweb/packages/studio/src/routes/ExperimentGroupDetailRoute/index.tsxweb/packages/studio/src/routes/WorkspaceLayout/WorkspaceSideNav.test.tsxweb/packages/studio/src/routes/WorkspaceLayout/WorkspaceSideNav.tsxweb/packages/studio/src/routes/groups/index.tsweb/packages/studio/src/routes/groups/optimizerRoutes.tsxweb/packages/studio/src/routes/index.test.tsxweb/packages/studio/src/routes/index.tsxweb/packages/studio/src/routes/optimizer/InsightOpenModal/command.tsweb/packages/studio/src/routes/optimizer/InsightOpenModal/index.test.tsweb/packages/studio/src/routes/optimizer/InsightOpenModal/index.tsxweb/packages/studio/src/routes/optimizer/InsightTracesTable/index.test.tsxweb/packages/studio/src/routes/optimizer/InsightTracesTable/index.tsxweb/packages/studio/src/routes/optimizer/OptimizerInsightRoute/InsightExperimentGroups.tsxweb/packages/studio/src/routes/optimizer/OptimizerInsightRoute/index.test.tsxweb/packages/studio/src/routes/optimizer/OptimizerInsightRoute/index.tsxweb/packages/studio/src/routes/optimizer/OptimizerRoute/index.test.tsxweb/packages/studio/src/routes/optimizer/OptimizerRoute/index.tsxweb/packages/studio/src/routes/optimizer/insightStatus.test.tsweb/packages/studio/src/routes/optimizer/insightStatus.tsweb/packages/studio/src/routes/utils.tsweb/packages/studio/src/tests/title-change.test.tsx
🚧 Files skipped from review as they are similar to previous changes (51)
- web/packages/studio/src/tests/title-change.test.tsx
- web/packages/studio/src/routes/optimizer/insightStatus.test.ts
- web/packages/studio/src/routes/WorkspaceLayout/WorkspaceSideNav.test.tsx
- web/packages/studio/src/routes/EvaluationDetailRoute/EvaluationDetailMetrics.tsx
- web/packages/studio/src/constants/featureFlags/featureFlags.ts
- web/packages/studio/src/routes/groups/index.ts
- services/intake/tests/integration/test_experiments_crud.py
- web/packages/studio/src/components/ExperimentGroupEditModal/index.test.tsx
- web/packages/studio/src/routes/utils.ts
- web/packages/studio/src/constants/environment.ts
- web/packages/studio/src/components/OriginatingInsightLink/index.tsx
- web/packages/studio/src/components/ChangesetBadge/index.tsx
- web/packages/studio/src/routes/EvaluationDetailRoute/index.test.tsx
- web/packages/studio/src/routes/optimizer/OptimizerRoute/index.test.tsx
- web/packages/studio/src/routes/groups/optimizerRoutes.tsx
- web/packages/studio/src/routes/WorkspaceLayout/WorkspaceSideNav.tsx
- web/packages/studio/src/routes/optimizer/InsightOpenModal/index.test.ts
- services/intake/src/nmp/intake/spans/clickhouse_client.py
- web/packages/studio/src/routes/optimizer/InsightOpenModal/index.tsx
- web/packages/studio/src/routes/ExperimentGroupDetailRoute/index.test.tsx
- web/packages/studio/src/routes/index.tsx
- web/packages/studio/src/routes/EvaluationDetailRoute/optimizerDisabled.test.tsx
- web/packages/studio/src/components/IntakeLists/intakeTraceColumns.tsx
- web/packages/studio/src/components/dataViews/ExperimentGroupDataView/index.tsx
- web/packages/studio/src/routes/optimizer/InsightOpenModal/command.ts
- services/intake/src/nmp/intake/api/v2/experiments/endpoints.py
- services/studio/src/nmp/studio/env_mappings.py
- web/packages/studio/src/components/ExperimentGroupEditModal/index.tsx
- web/packages/studio/src/routes/ExperimentGroupDetailRoute/index.tsx
- web/packages/studio/src/routes/optimizer/OptimizerRoute/index.tsx
- web/packages/studio/src/routes/index.test.tsx
- web/packages/studio/src/routes/optimizer/insightStatus.ts
- services/intake/src/nmp/intake/spans/domain.py
- web/packages/studio/src/routes/optimizer/OptimizerInsightRoute/InsightExperimentGroups.tsx
- services/intake/tests/test_traces_api.py
- web/packages/studio/src/constants/routes.ts
- web/packages/studio/src/routes/optimizer/InsightTracesTable/index.test.tsx
- services/intake/src/nmp/intake/spans/api/traces.py
- plugins/nemo-insights/tests/test_insights_list_contract.py
- openapi/openapi.yaml
- openapi/ga/individual/platform.openapi.yaml
- openapi/ga/openapi.yaml
- web/packages/studio/src/routes/optimizer/OptimizerInsightRoute/index.tsx
- web/packages/studio/src/routes/optimizer/InsightTracesTable/index.tsx
- plugins/nemo-insights/src/nemo_insights_plugin/service.py
- web/packages/studio/src/routes/optimizer/OptimizerInsightRoute/index.test.tsx
- web/packages/studio/src/components/IntakeLists/IntakeTracesTable.tsx
- web/packages/studio/src/api/optimizer.ts
- web/packages/studio/src/routes/EvaluationDetailRoute/index.tsx
- services/intake/tests/test_traces_clickhouse_repository.py
- plugins/nemo-insights/scripts/insights_demo.py
Adds the Optimizer Insights section to Studio and links insights to the experiments (evaluations) run against them:
Uses the platform's current hierarchy conventions: experiment group ->
experiment (container) and experiment -> evaluation (leaf).
Summary by CodeRabbit