Rename prompt and completion tokens to input and output tokens

This commit is contained in:
David Corbitt
2023-08-10 19:49:18 -07:00
parent 76c34d64e6
commit 1f8e3b820f
8 changed files with 45 additions and 28 deletions

View File

@@ -0,0 +1,15 @@
/*
Warnings:
- You are about to rename the column `completionTokens` to `outputTokens` on the `ModelResponse` table.
- You are about to rename the column `promptTokens` to `inputTokens` on the `ModelResponse` table.
*/
-- Rename completionTokens to outputTokens
ALTER TABLE "ModelResponse"
RENAME COLUMN "completionTokens" TO "outputTokens";
-- Rename promptTokens to inputTokens
ALTER TABLE "ModelResponse"
RENAME COLUMN "promptTokens" TO "inputTokens";

View File

@@ -117,8 +117,8 @@ model ModelResponse {
receivedAt DateTime? receivedAt DateTime?
output Json? output Json?
cost Float? cost Float?
promptTokens Int? inputTokens Int?
completionTokens Int? outputTokens Int?
statusCode Int? statusCode Int?
errorMessage String? errorMessage String?
retryTime DateTime? retryTime DateTime?

View File

@@ -19,8 +19,8 @@ export const OutputStats = ({
? modelResponse.receivedAt.getTime() - modelResponse.requestedAt.getTime() ? modelResponse.receivedAt.getTime() - modelResponse.requestedAt.getTime()
: 0; : 0;
const promptTokens = modelResponse.promptTokens; const inputTokens = modelResponse.inputTokens;
const completionTokens = modelResponse.completionTokens; const outputTokens = modelResponse.outputTokens;
return ( return (
<HStack <HStack
@@ -55,8 +55,8 @@ export const OutputStats = ({
</HStack> </HStack>
{modelResponse.cost && ( {modelResponse.cost && (
<CostTooltip <CostTooltip
promptTokens={promptTokens} inputTokens={inputTokens}
completionTokens={completionTokens} outputTokens={outputTokens}
cost={modelResponse.cost} cost={modelResponse.cost}
> >
<HStack spacing={0}> <HStack spacing={0}>

View File

@@ -17,8 +17,8 @@ export default function VariantStats(props: { variant: PromptVariant }) {
initialData: { initialData: {
evalResults: [], evalResults: [],
overallCost: 0, overallCost: 0,
promptTokens: 0, inputTokens: 0,
completionTokens: 0, outputTokens: 0,
scenarioCount: 0, scenarioCount: 0,
outputCount: 0, outputCount: 0,
awaitingEvals: false, awaitingEvals: false,
@@ -68,8 +68,8 @@ export default function VariantStats(props: { variant: PromptVariant }) {
</HStack> </HStack>
{data.overallCost && ( {data.overallCost && (
<CostTooltip <CostTooltip
promptTokens={data.promptTokens} inputTokens={data.inputTokens}
completionTokens={data.completionTokens} outputTokens={data.outputTokens}
cost={data.overallCost} cost={data.overallCost}
> >
<HStack spacing={0} align="center" color="gray.500"> <HStack spacing={0} align="center" color="gray.500">

View File

@@ -2,14 +2,14 @@ import { HStack, Icon, Text, Tooltip, type TooltipProps, VStack, Divider } from
import { BsCurrencyDollar } from "react-icons/bs"; import { BsCurrencyDollar } from "react-icons/bs";
type CostTooltipProps = { type CostTooltipProps = {
promptTokens: number | null; inputTokens: number | null;
completionTokens: number | null; outputTokens: number | null;
cost: number; cost: number;
} & TooltipProps; } & TooltipProps;
export const CostTooltip = ({ export const CostTooltip = ({
promptTokens, inputTokens,
completionTokens, outputTokens,
cost, cost,
children, children,
...props ...props
@@ -36,12 +36,12 @@ export const CostTooltip = ({
<HStack> <HStack>
<VStack w="28" spacing={1}> <VStack w="28" spacing={1}>
<Text>Prompt</Text> <Text>Prompt</Text>
<Text>{promptTokens ?? 0}</Text> <Text>{inputTokens ?? 0}</Text>
</VStack> </VStack>
<Divider borderColor="gray.200" h={8} orientation="vertical" /> <Divider borderColor="gray.200" h={8} orientation="vertical" />
<VStack w="28" spacing={1}> <VStack w="28" spacing={1}>
<Text whiteSpace="nowrap">Completion</Text> <Text whiteSpace="nowrap">Completion</Text>
<Text>{completionTokens ?? 0}</Text> <Text>{outputTokens ?? 0}</Text>
</VStack> </VStack>
</HStack> </HStack>
</VStack> </VStack>

View File

@@ -43,9 +43,6 @@ export type CompletionResponse<T> =
value: T; value: T;
timeToComplete: number; timeToComplete: number;
statusCode: number; statusCode: number;
promptTokens?: number;
completionTokens?: number;
cost?: number;
}; };
export type ModelProvider<SupportedModels extends string, InputSchema, OutputSchema> = { export type ModelProvider<SupportedModels extends string, InputSchema, OutputSchema> = {
@@ -56,6 +53,10 @@ export type ModelProvider<SupportedModels extends string, InputSchema, OutputSch
input: InputSchema, input: InputSchema,
onStream: ((partialOutput: OutputSchema) => void) | null, onStream: ((partialOutput: OutputSchema) => void) | null,
) => Promise<CompletionResponse<OutputSchema>>; ) => Promise<CompletionResponse<OutputSchema>>;
getUsage: (
input: InputSchema,
output: OutputSchema,
) => { gpuRuntime?: number; inputTokens?: number; outputTokens?: number; cost?: number } | null;
// This is just a convenience for type inference, don't use it at runtime // This is just a convenience for type inference, don't use it at runtime
_outputSchema?: OutputSchema | null; _outputSchema?: OutputSchema | null;

View File

@@ -123,13 +123,13 @@ export const promptVariantsRouter = createTRPCRouter({
}, },
_sum: { _sum: {
cost: true, cost: true,
promptTokens: true, inputTokens: true,
completionTokens: true, outputTokens: true,
}, },
}); });
const promptTokens = overallTokens._sum?.promptTokens ?? 0; const inputTokens = overallTokens._sum?.inputTokens ?? 0;
const completionTokens = overallTokens._sum?.completionTokens ?? 0; const outputTokens = overallTokens._sum?.outputTokens ?? 0;
const awaitingEvals = !!evalResults.find( const awaitingEvals = !!evalResults.find(
(result) => result.totalCount < scenarioCount * evals.length, (result) => result.totalCount < scenarioCount * evals.length,
@@ -137,8 +137,8 @@ export const promptVariantsRouter = createTRPCRouter({
return { return {
evalResults, evalResults,
promptTokens, inputTokens,
completionTokens, outputTokens,
overallCost: overallTokens._sum?.cost ?? 0, overallCost: overallTokens._sum?.cost ?? 0,
scenarioCount, scenarioCount,
outputCount, outputCount,

View File

@@ -110,15 +110,16 @@ export const queryModel = defineTask<QueryModelJob>("queryModel", async (task) =
}); });
const response = await provider.getCompletion(prompt.modelInput, onStream); const response = await provider.getCompletion(prompt.modelInput, onStream);
if (response.type === "success") { if (response.type === "success") {
const usage = provider.getUsage(prompt.modelInput, response.value);
modelResponse = await prisma.modelResponse.update({ modelResponse = await prisma.modelResponse.update({
where: { id: modelResponse.id }, where: { id: modelResponse.id },
data: { data: {
output: response.value as Prisma.InputJsonObject, output: response.value as Prisma.InputJsonObject,
statusCode: response.statusCode, statusCode: response.statusCode,
receivedAt: new Date(), receivedAt: new Date(),
promptTokens: response.promptTokens, inputTokens: usage?.inputTokens,
completionTokens: response.completionTokens, outputTokens: usage?.outputTokens,
cost: response.cost, cost: usage?.cost,
}, },
}); });