add cost tooltip (#22)

* add cost tooltip

* add padding and style
This commit is contained in:
jarenm
2023-07-07 20:34:45 -06:00
committed by GitHub
parent 48c3b7dcab
commit d7fb4a7236
4 changed files with 83 additions and 10 deletions

View File

@@ -7,6 +7,7 @@ import { calculateTokenCost } from "~/utils/calculateTokenCost";
import { evaluateOutput } from "~/server/utils/evaluateOutput"; import { evaluateOutput } from "~/server/utils/evaluateOutput";
import { HStack, Icon, Text } from "@chakra-ui/react"; import { HStack, Icon, Text } from "@chakra-ui/react";
import { BsCheck, BsClock, BsCurrencyDollar, BsX } from "react-icons/bs"; import { BsCheck, BsClock, BsCurrencyDollar, BsX } from "react-icons/bs";
import { CostTooltip } from "~/components/tooltip/CostTooltip";
export const OutputStats = ({ export const OutputStats = ({
model, model,
@@ -48,10 +49,12 @@ export const OutputStats = ({
); );
})} })}
</HStack> </HStack>
<CostTooltip promptTokens={promptTokens} completionTokens={completionTokens} cost={cost}>
<HStack spacing={0}> <HStack spacing={0}>
<Icon as={BsCurrencyDollar} /> <Icon as={BsCurrencyDollar} />
<Text mr={1}>{cost.toFixed(3)}</Text> <Text mr={1}>{cost.toFixed(3)}</Text>
</HStack> </HStack>
</CostTooltip>
<HStack spacing={0.5}> <HStack spacing={0.5}>
<Icon as={BsClock} /> <Icon as={BsClock} />
<Text>{(timeToComplete / 1000).toFixed(2)}s</Text> <Text>{(timeToComplete / 1000).toFixed(2)}s</Text>

View File

@@ -4,13 +4,23 @@ import { cellPadding } from "../constants";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
import chroma from "chroma-js"; import chroma from "chroma-js";
import { BsCurrencyDollar } from "react-icons/bs"; import { BsCurrencyDollar } from "react-icons/bs";
import { CostTooltip } from "../tooltip/CostTooltip";
export default function VariantStats(props: { variant: PromptVariant }) { export default function VariantStats(props: { variant: PromptVariant }) {
const { data } = api.promptVariants.stats.useQuery( const { data } = api.promptVariants.stats.useQuery(
{ {
variantId: props.variant.id, variantId: props.variant.id,
}, },
{ initialData: { evalResults: [], overallCost: 0, scenarioCount: 0, outputCount: 0 } } {
initialData: {
evalResults: [],
overallCost: 0,
promptTokens: 0,
completionTokens: 0,
scenarioCount: 0,
outputCount: 0,
},
}
); );
const [passColor, neutralColor, failColor] = useToken("colors", [ const [passColor, neutralColor, failColor] = useToken("colors", [
@@ -46,10 +56,16 @@ export default function VariantStats(props: { variant: PromptVariant }) {
})} })}
</HStack> </HStack>
{data.overallCost && ( {data.overallCost && (
<CostTooltip
promptTokens={data.promptTokens}
completionTokens={data.completionTokens}
cost={data.overallCost}
>
<HStack spacing={0} align="center" color="gray.500" my="2"> <HStack spacing={0} align="center" color="gray.500" my="2">
<Icon as={BsCurrencyDollar} /> <Icon as={BsCurrencyDollar} />
<Text mr={1}>{data.overallCost.toFixed(3)}</Text> <Text mr={1}>{data.overallCost.toFixed(3)}</Text>
</HStack> </HStack>
</CostTooltip>
)} )}
</HStack> </HStack>
); );

View File

@@ -0,0 +1,54 @@
import { HStack, Icon, Text, Tooltip, type TooltipProps, VStack, Divider } from "@chakra-ui/react";
import { BsCurrencyDollar } from "react-icons/bs";
type CostTooltipProps = {
promptTokens: number | null;
completionTokens: number | null;
cost: number;
} & TooltipProps;
export const CostTooltip = ({
promptTokens,
completionTokens,
cost,
children,
...props
}: CostTooltipProps) => {
return (
<Tooltip
borderRadius="8"
color="gray.800"
bgColor="gray.50"
py={2}
hasArrow
label={
<VStack fontSize="sm" w="200">
<VStack>
<Text fontWeight="bold">Cost</Text>
<HStack spacing={0}>
<Icon as={BsCurrencyDollar} />
<Text>{cost.toFixed(6)}</Text>
</HStack>
</VStack>
<VStack>
<Text fontWeight="bold">Tokens</Text>
<HStack>
<VStack w="28">
<Text>Prompt</Text>
<Text>{promptTokens ?? 0}</Text>
</VStack>
<Divider borderColor="gray.200" h={12} orientation="vertical" />
<VStack w="28">
<Text whiteSpace="nowrap">Completion</Text>
<Text>{completionTokens ?? 0}</Text>
</VStack>
</HStack>
</VStack>
</VStack>
}
{...props}
>
{children}
</Tooltip>
);
};

View File

@@ -66,7 +66,7 @@ export const promptVariantsRouter = createTRPCRouter({
const overallCost = overallPromptCost + overallCompletionCost; const overallCost = overallPromptCost + overallCompletionCost;
return { evalResults, overallCost, scenarioCount, outputCount }; return { evalResults, promptTokens, completionTokens, overallCost, scenarioCount, outputCount };
}), }),
create: publicProcedure create: publicProcedure