From 5d7b51ba1dad57df04db48a034d56f4c320108fb Mon Sep 17 00:00:00 2001 From: Webifi Date: Sun, 28 May 2023 11:57:07 -0500 Subject: [PATCH] Add usage totals --- src/lib/Chat.svelte | 41 +++++++++++++++++++++++++++++--------- src/lib/EditMessage.svelte | 19 +++++++++++++----- src/lib/Stats.svelte | 17 ---------------- src/lib/Storage.svelte | 36 ++++++++++++++++++++++++++++++--- src/lib/Types.svelte | 4 +--- 5 files changed, 80 insertions(+), 37 deletions(-) diff --git a/src/lib/Chat.svelte b/src/lib/Chat.svelte index 760cbcd..5c4baed 100644 --- a/src/lib/Chat.svelte +++ b/src/lib/Chat.svelte @@ -17,7 +17,10 @@ updateChatSettings, resetChatSettings, setChatSettingValue, - addChatFromJSON + addChatFromJSON, + + updateRunningTotal + } from './Storage.svelte' import { getChatSettingObjectByKey, getChatSettingList, getRequestSettingList } from './Settings.svelte' import { @@ -59,6 +62,7 @@ import { v4 as uuidv4 } from 'uuid' import { exportChatAsJSON, exportProfileAsJSON } from './Export.svelte' import { clickOutside } from 'svelte-use-click-outside' + import { getPrice } from './Stats.svelte'; // This makes it possible to override the OpenAI API base URL in the .env file const apiBase = import.meta.env.VITE_API_BASE || 'https://api.openai.com' @@ -86,9 +90,10 @@ $: chatSettings = chat.settings $: globalStore = $globalStorage + // Make sure chat object is ready to go + updateChatSettings(chatId) + onMount(async () => { - // Make sure chat object is ready to go - updateChatSettings(chatId) // Focus the input on mount focusInput() @@ -147,7 +152,6 @@ const sendRequest = async (messages: Message[], doingSummary?:boolean, withSummary?:boolean): Promise => { // Show updating bar updating = true - updatingMessage = '' let response: Response @@ -207,6 +211,7 @@ content: summaryPrompt } as Message) // Wait for the summary completion + updatingMessage = 'Building Summary...' const summary = await sendRequest(summarizeReq, true) if (summary.error) { // Failed to some API issue. let the original caller handle it. @@ -241,6 +246,7 @@ saveChatStore() // Re-run request with summarized prompts // return { error: { message: "End for now" } } as Response + updatingMessage = 'Continuing...' return await sendRequest(chat.messages, false, true) } } else if (!summaryPrompt) { @@ -313,10 +319,7 @@ updatingMessage = '' if (!response.error) { - // tc.completions++ - // tc.completionsTokens += response.usage.completion_tokens - // chat.totals.push(tc) - // console.log('got response:', response) + updateRunningTotal(chatId, response.usage, response.model) } return response @@ -777,7 +780,15 @@

-
+ +
+ {#each Object.entries(chat.usage||{}) as [model, usage]} +

+ {model} total {usage.total_tokens} + tokens ~= ${getPrice(usage, model).toFixed(6)} +

+ {/each} +
{ @@ -959,3 +970,15 @@ + + diff --git a/src/lib/EditMessage.svelte b/src/lib/EditMessage.svelte index 59f5912..5e81e67 100644 --- a/src/lib/EditMessage.svelte +++ b/src/lib/EditMessage.svelte @@ -82,6 +82,7 @@ console.error("Can't find element with message ID", uuid) } } + {#key message.uuid} @@ -137,19 +138,22 @@
{:else} - {}} on:dblclick|preventDefault={() => edit('edit-' + message.uuid)}> + {/if} {#if message.role === 'system'} -

System Prompt

+

System Prompt

{:else if message.usage} -

- This message was generated on {message.model || defaultModel} using {message.usage.total_tokens} +

+ {message.model || defaultModel} using {message.usage.total_tokens} tokens ~= ${getPrice(message.usage, message.model || defaultModel).toFixed(6)}

{/if} @@ -158,6 +162,11 @@ {/key}