From 760bfbbe32d76ba83c56c847dd58446d8ed0d2e9 Mon Sep 17 00:00:00 2001 From: David Corbitt Date: Tue, 8 Aug 2023 18:15:42 -0700 Subject: [PATCH] Fix issue with timezones --- app/prisma/seedDashboard.ts | 32 ++++++++++++++----- .../server/api/routers/dashboard.router.ts | 8 +++-- app/src/server/utils/openai.ts | 10 +++--- app/src/utils/dayjs.ts | 2 ++ 4 files changed, 38 insertions(+), 14 deletions(-) diff --git a/app/prisma/seedDashboard.ts b/app/prisma/seedDashboard.ts index bbbd48f..88d2ad3 100644 --- a/app/prisma/seedDashboard.ts +++ b/app/prisma/seedDashboard.ts @@ -331,13 +331,19 @@ const loggedCallsToCreate: Prisma.LoggedCallCreateManyInput[] = []; const loggedCallModelResponsesToCreate: Prisma.LoggedCallModelResponseCreateManyInput[] = []; const loggedCallsToUpdate: Prisma.LoggedCallUpdateArgs[] = []; const loggedCallTagsToCreate: Prisma.LoggedCallTagCreateManyInput[] = []; -for (let i = 0; i < 100; i++) { +for (let i = 0; i < 437; i++) { const loggedCallId = uuidv4(); const loggedCallModelResponseId = uuidv4(); + const template = + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + MODEL_RESPONSE_TEMPLATES[Math.floor(Math.random() * MODEL_RESPONSE_TEMPLATES.length)]!; + const model = template.reqPayload.model; // choose random time in the last two weeks, with a bias towards the last few days - const startTime = new Date(Date.now() - Math.random() * 1000 * 60 * 60 * 24 * 14); - // choose random time anywhere from 1 to 25 seconds later - const endTime = new Date(startTime.getTime() + Math.random() * 1000 * 24); + const startTime = new Date(Date.now() - Math.pow(Math.random(), 2) * 1000 * 60 * 60 * 24 * 14); + // choose random delay anywhere from 2 to 10 seconds later for gpt-4, or 1 to 5 seconds for gpt-3.5 + const delay = + model === "gpt-4" ? 1000 * 2 + Math.random() * 1000 * 8 : 1000 + Math.random() * 1000 * 4; + const endTime = new Date(startTime.getTime() + delay); loggedCallsToCreate.push({ id: loggedCallId, cacheHit: false, @@ -345,9 +351,18 @@ for (let i = 0; i < 100; i++) { organizationId: org.id, createdAt: startTime, }); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const template = - MODEL_RESPONSE_TEMPLATES[Math.floor(Math.random() * MODEL_RESPONSE_TEMPLATES.length)]!; + + const { promptTokenPrice, completionTokenPrice } = + model === "gpt-4" + ? { + promptTokenPrice: 0.00003, + completionTokenPrice: 0.00006, + } + : { + promptTokenPrice: 0.0000015, + completionTokenPrice: 0.000002, + }; + loggedCallModelResponsesToCreate.push({ id: loggedCallModelResponseId, startTime, @@ -363,7 +378,8 @@ for (let i = 0; i < 100; i++) { inputTokens: template.inputTokens, outputTokens: template.outputTokens, finishReason: template.finishReason, - totalCost: template.inputTokens * 0.06 + template.outputTokens * 0.06, + totalCost: + template.inputTokens * promptTokenPrice + template.outputTokens * completionTokenPrice, }); loggedCallsToUpdate.push({ where: { diff --git a/app/src/server/api/routers/dashboard.router.ts b/app/src/server/api/routers/dashboard.router.ts index b31e365..b18e1c0 100644 --- a/app/src/server/api/routers/dashboard.router.ts +++ b/app/src/server/api/routers/dashboard.router.ts @@ -32,11 +32,15 @@ export const dashboardRouter = createTRPCRouter({ .execute(); let originalDataIndex = periods.length - 1; - let dayToMatch = dayjs(input.startDate).startOf("day"); + // *SLAMS DOWN GLASS OF WHISKEY* timezones, amirite? + let dayToMatch = dayjs(input.startDate || new Date()).add(1, "day"); const backfilledPeriods: typeof periods = []; // Backfill from now to 14 days ago or the date of the first logged call, whichever is earlier - while (backfilledPeriods.length < 14 || originalDataIndex >= 0) { + while ( + backfilledPeriods.length < 14 || + (periods[0]?.period && !dayToMatch.isBefore(periods[0]?.period, "day")) + ) { const nextOriginalPeriod = periods[originalDataIndex]; if (nextOriginalPeriod && dayjs(nextOriginalPeriod?.period).isSame(dayToMatch, "day")) { backfilledPeriods.unshift(nextOriginalPeriod); diff --git a/app/src/server/utils/openai.ts b/app/src/server/utils/openai.ts index b29700b..64ac3d8 100644 --- a/app/src/server/utils/openai.ts +++ b/app/src/server/utils/openai.ts @@ -1,11 +1,13 @@ import { env } from "~/env.mjs"; import { default as OriginalOpenAI } from "openai"; -import { OpenAI } from "openpipe"; +// import { OpenAI } from "openpipe"; const openAIConfig = { apiKey: env.OPENAI_API_KEY ?? "dummy-key" }; // Set a dummy key so it doesn't fail at build time -export const openai = env.OPENPIPE_API_KEY - ? new OpenAI.OpenAI(openAIConfig) - : new OriginalOpenAI(openAIConfig); +// export const openai = env.OPENPIPE_API_KEY +// ? new OpenAI.OpenAI(openAIConfig) +// : new OriginalOpenAI(openAIConfig); + +export const openai = new OriginalOpenAI(openAIConfig); diff --git a/app/src/utils/dayjs.ts b/app/src/utils/dayjs.ts index 1d84bff..9656a25 100644 --- a/app/src/utils/dayjs.ts +++ b/app/src/utils/dayjs.ts @@ -1,9 +1,11 @@ import dayjs from "dayjs"; import duration from "dayjs/plugin/duration"; import relativeTime from "dayjs/plugin/relativeTime"; +import timezone from "dayjs/plugin/timezone"; dayjs.extend(duration); dayjs.extend(relativeTime); +dayjs.extend(timezone); export const formatTimePast = (date: Date) => dayjs.duration(dayjs(date).diff(dayjs())).humanize(true);