Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ export interface StatusResultProps extends Partial<StatusMessageProps> {
hasFiltersApplied: boolean;
hasSearchApplied: boolean;
}
) => JSX.Element;
) => JSX.Element | null;
}

export function StatusResult({
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
// SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
// SPDX-License-Identifier: Apache-2.0

import { TableEmptyState } from '@nemo/common/src/components/TableEmptyState';
import {
Button,
CodeSnippet,
TabsContent,
TabsList,
TabsRoot,
TabsTrigger,
Text,
} from '@nvidia/foundations-react-core';
import { LINK_DOCS_EXPERIMENTS_CLI } from '@studio/constants/links';
import { Bot, ChevronRight, File, FlaskConical, Terminal } from 'lucide-react';

interface EmptyProps {
experimentGroupName: string;
}

export const Empty = ({ experimentGroupName }: EmptyProps) => {
const escapedGroupName = experimentGroupName.replace(/'/g, "'\\''");
const cliCommand =
`nemo exp run \\\n` +
` --group '${escapedGroupName}' \\\n` +
` --dataset "<dataset-name>" \\\n` +
` --evaluators correctness,helpfulness,groundedness,tool-error`;
Comment thread
walston marked this conversation as resolved.

return (
<TableEmptyState
icon={<FlaskConical className="size-12" />}
header="No Experiments"
emptyMessage="Run an experiment to see results for this group."
actions={
<div className="w-[560px] border border-base rounded-lg overflow-hidden bg-surface-overlay">
<TabsRoot defaultValue="cli">
<TabsList className="px-density-md">
<TabsTrigger value="coding-agent">
<Bot className="size-4" />
Coding agent
</TabsTrigger>
<TabsTrigger value="cli">
<Terminal className="size-4" />
CLI command
</TabsTrigger>
</TabsList>
<div className="px-density-md pb-density-md flex flex-col gap-density-sm">
<TabsContent value="coding-agent" className="px-0 pb-0 w-full">
<CodeSnippet
value="To be determined"
language="text"
kind="block"
className="w-full whitespace-pre-line"
/>
</TabsContent>
<TabsContent value="cli" className="px-0 pb-0">
<CodeSnippet value={cliCommand} language="bash" kind="block" className="w-full" />
</TabsContent>
<Button
asChild
color="neutral"
kind="tertiary"
size="small"
className="w-full justify-start"
>
<a href={LINK_DOCS_EXPERIMENTS_CLI} target="_blank" rel="noreferrer">
<File className="!text-brand" />
<Text className="flex-1">CLI docs — learn more</Text>
<ChevronRight />
</a>
</Button>
</div>
</TabsRoot>
</div>
}
/>
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import {
import { StudioDataView } from '@nemo/common/src/components/DataView/StudioDataView';
import { ErrorMessage } from '@nemo/common/src/components/ErrorMessage';
import { RelativeTime } from '@nemo/common/src/components/RelativeTime';
import { TableEmptyState } from '@nemo/common/src/components/TableEmptyState';
import { useStudioDataViewState } from '@nemo/common/src/hooks/useStudioDataViewState';
import { getSortParamWithWhitelist } from '@nemo/common/src/utils/query';
import { useGetExperimentGroup, useListExperiments } from '@nemo/sdk/generated/platform/api';
Expand All @@ -19,6 +18,7 @@ import type {
ListExperimentsSort,
} from '@nemo/sdk/generated/platform/schema';
import { Text, Tooltip } from '@nvidia/foundations-react-core';
import { Empty } from '@studio/components/dataViews/ExperimentGroupDataView/Empty';
import { useWorkspaceFromPath } from '@studio/hooks/useWorkspaceFromPath';
import { getExperimentDetailRoute } from '@studio/routes/utils';
import { tooltipClassName } from '@studio/styles/common';
Expand Down Expand Up @@ -258,12 +258,10 @@ export const ExperimentGroupDataView: FC<ExperimentGroupDataViewProps> = ({
requestStatus: isGroupLoading || (isLoading && !experimentsData) ? 'loading' : undefined,
},
DataViewTableContent: {
renderEmptyState: () => (
<TableEmptyState
header="No Experiments"
emptyMessage="This group has no experiments yet."
/>
),
renderEmptyState: ({ hasFiltersApplied, hasSearchApplied }) =>
hasFiltersApplied || hasSearchApplied ? null : (
<Empty experimentGroupName={experimentGroupName} />
),
},
}}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ export const Empty = ({ experimentGroupName, datasetName }: EmptyProps) => {
header="No test cases"
emptyMessage="Run an experiment to see test case results."
actions={
<div className="w-[560px] border border-base rounded-lg overflow-hidden">
<div className="w-[560px] border border-base rounded-lg overflow-hidden bg-surface-overlay">
<TabsRoot defaultValue="cli">
<TabsList className="px-density-md">
<TabsTrigger value="coding-agent">
Expand Down
Loading