/** * * Copyright 2023-2024 InspectorRAGet Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **/ 'use client'; import Link from 'next/link'; import { useMemo, memo } from 'react'; import { ExpandableTile, TileAboveTheFoldContent, TileBelowTheFoldContent, Tag, DefinitionTooltip, Tooltip, Toggletip, ToggletipButton, ToggletipContent, ToggletipActions, UnorderedList, ListItem, Button, } from '@carbon/react'; import { Task as TaskIcon, Information, Flag, FlagFilled, Chat, Copy, } from '@carbon/icons-react'; import { Task, TaskEvaluation } from '@/src/types'; import { MetricDefinitions } from '@/src/utilities/metrics'; import { castDurationToString } from '@/src/utilities/time'; import classes from './TaskTile.module.scss'; interface Props { task: Task; evaluations: TaskEvaluation[]; expanded?: boolean; onClickFlagIcon: Function; onClickCommentsIcon: Function; onClickCopyToClipboardIcon?: Function; } export default memo(function TaskTile({ task, evaluations, expanded = true, onClickFlagIcon, onClickCommentsIcon, onClickCopyToClipboardIcon, }: Props) { // Step 1: Extract neccessary information const [annotators, metrics, models, duration] = useMemo(() => { const annotatorsMap: { [key: string]: number } = {}; const metricsSet: Set = new Set(); const modelsSet: Set = new Set(); evaluations.forEach((evaluation) => { // Add model information modelsSet.add(evaluation.modelId); for (const metric in evaluation.annotations) { // Add metric information metricsSet.add(metric); for (const annotator in evaluation.annotations[metric]) { // Add annotator information annotatorsMap[annotator] = evaluation.annotations[metric][annotator].duration || 0; } } }); // Calcuate average time taken by annotators const avgDuration: number = Math.floor( Object.values(annotatorsMap).reduce((a, b) => a + b, 0) / Object.keys(annotatorsMap).length, ); return [annotatorsMap, metricsSet, modelsSet, avgDuration]; }, [evaluations]); const [ durationInDays, durationInHours, durationInMinutes, durationInSeconds, ] = useMemo(() => castDurationToString(duration), [duration]); return (
{task.taskId}
{onClickCopyToClipboardIcon && (
# of evaluations
{evaluations.length}
# of annotators
{Object.keys(annotators).length}
Metrics

Analytics platform supports three kind of metrics

Go vs No-Go Rubric Intuitive Rubric Detailed Rubric Reference
{Array.from(metrics).map((metric, idx) => { return ( {metric} ); })}
Models
{Array.from(models).map((model, idx) => { return ( {model} ); })}
{durationInDays || durationInHours || durationInMinutes || durationInSeconds ? (
Duration
{ // Step 1: Convert duration to string const [ durationInDaysForAnnotator, durationInHoursForAnnotator, durationInMinutesForAnnotator, durationInSecondsForAnnotator, ] = castDurationToString(annotators[annotator]); return ( <> {annotator}:  {durationInDaysForAnnotator ? durationInDaysForAnnotator + ' days ' : ''} {durationInHoursForAnnotator ? durationInHoursForAnnotator + ' hours ' : ''} {durationInMinutesForAnnotator ? durationInMinutesForAnnotator + ' mins ' : ''} {durationInSecondsForAnnotator} sec
); }, )} align={'bottom'} openOnHover={true} > {durationInDays ? durationInDays + ' days ' : ''} {durationInHours ? durationInHours + ' hours ' : ''} {durationInMinutes ? durationInMinutes + ' mins ' : ''} {durationInSeconds} sec
) : null}
); });