Rename prompt and completion tokens to input and output tokens
This commit is contained in:
@@ -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";
|
||||||
@@ -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?
|
||||||
|
|||||||
@@ -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}>
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user