From 89f5802e8dc61ba7d100a586bd2d5372f01b636f Mon Sep 17 00:00:00 2001 From: Enrico Ros Date: Mon, 3 Apr 2023 04:03:12 -0700 Subject: [PATCH] Large improvement to (model-dependent) token utilization And update README.md --- README.md | 6 +++++- components/Chat.tsx | 8 ++++---- components/Composer.tsx | 16 ++++++++++++---- components/dialogs/SettingsModal.tsx | 8 ++++---- docs/feature_token_counter.png | Bin 0 -> 8779 bytes lib/data.ts | 3 +++ lib/store-settings.ts | 8 ++++---- 7 files changed, 32 insertions(+), 17 deletions(-) create mode 100644 docs/feature_token_counter.png diff --git a/README.md b/README.md index 601fa8451..5c5afed96 100644 --- a/README.md +++ b/README.md @@ -26,10 +26,14 @@ Or click fork & run on Vercel 🚨 **We added cool new features to the app!** (bare-bones was [466a36](https://github.com/enricoros/nextjs-chatgpt-app/tree/466a3667a48060d406d60943af01fe26366563fb)) +- [x] _NEW 04.03_ 🎉 **PDF import** 📄🔀🧠 (fredliubojin) <- "ask questions to a PDF!" 🤯 +- [x] _NEW 04.03_ 🎉 **NEW 04.03** Tokens utilization 📊 [WIP] +

Token Counters

+- [x] _NEW 04.02_ 🎉 **Markdown rendering** 🎨 (nilshulth) [WIP] - [x] 🎉 **NEW 04.01** Typing Avatars

New Typing Avatars

- [x] 🎉 **NEW 03.31** Publish & share chats to paste.gg 📥 -

Export chats

+

Export chats

- [x] Chat with GPT-4 and 3.5 Turbo 🧠💨 - [x] **Private**: user-owned API keys 🔑 and localStorage 🛡️ - [x] **System presets** - including Code, Science, Corporate, and Chat 🎭 diff --git a/components/Chat.tsx b/components/Chat.tsx index c74d3e4ab..8625bec43 100644 --- a/components/Chat.tsx +++ b/components/Chat.tsx @@ -37,7 +37,7 @@ function createDMessage(role: DMessage['role'], text: string): DMessage { async function _streamAssistantResponseMessage( conversationId: string, history: DMessage[], apiKey: string | undefined, apiHost: string | undefined, - chatModelId: string, modelTemperature: number, modelMaxTokens: number, abortSignal: AbortSignal, + chatModelId: string, modelTemperature: number, modelMaxResponseTokens: number, abortSignal: AbortSignal, addMessage: (conversationId: string, message: DMessage) => void, editMessage: (conversationId: string, messageId: string, updatedMessage: Partial, touch: boolean) => void, ) { @@ -58,7 +58,7 @@ async function _streamAssistantResponseMessage( content: text, })), temperature: modelTemperature, - max_tokens: modelMaxTokens, + max_tokens: modelMaxResponseTokens, }; try { @@ -153,9 +153,9 @@ export function Chat(props: { onShowSettings: () => void, sx?: SxProps }) { const controller = new AbortController(); setAbortController(controller); - const { apiKey, modelTemperature, modelMaxTokens, modelApiHost } = useSettingsStore.getState(); + const { apiKey, modelTemperature, modelMaxResponseTokens, modelApiHost } = useSettingsStore.getState(); const { appendMessage, editMessage } = useChatStore.getState(); - await _streamAssistantResponseMessage(conversationId, history, apiKey, modelApiHost, chatModelId, modelTemperature, modelMaxTokens, controller.signal, appendMessage, editMessage); + await _streamAssistantResponseMessage(conversationId, history, apiKey, modelApiHost, chatModelId, modelTemperature, modelMaxResponseTokens, controller.signal, appendMessage, editMessage); // clear to send, again setAbortController(null); diff --git a/components/Composer.tsx b/components/Composer.tsx index 57d2c48ec..771c9f644 100644 --- a/components/Composer.tsx +++ b/components/Composer.tsx @@ -10,10 +10,11 @@ import PostAddIcon from '@mui/icons-material/PostAdd'; import StopOutlinedIcon from '@mui/icons-material/StopOutlined'; import TelegramIcon from '@mui/icons-material/Telegram'; +import { ChatModels } from '@/lib/data'; import { countModelTokens } from '@/lib/token-counters'; import { extractPdfText } from '@/lib/pdf'; import { useActiveConfiguration } from '@/lib/store-chats'; -import { useComposerStore } from '@/lib/store-settings'; +import { useComposerStore, useSettingsStore } from '@/lib/store-settings'; import { useSpeechRecognition } from '@/components/util/useSpeechRecognition'; @@ -54,6 +55,7 @@ export function Composer(props: { disableSend: boolean; isDeveloperMode: boolean // external state const { history, appendMessageToHistory } = useComposerStore(state => ({ history: state.history, appendMessageToHistory: state.appendMessageToHistory }), shallow); const { chatModelId } = useActiveConfiguration(); + const modelMaxResponseTokens = useSettingsStore(state => state.modelMaxResponseTokens); const handleSendClicked = () => { @@ -187,7 +189,13 @@ export function Composer(props: { disableSend: boolean; isDeveloperMode: boolean const hideOnDesktop = { display: { xs: 'flex', md: 'none' } }; // compute tokens (warning: slow - shall have a toggle) - const estimatedTokens = countModelTokens(composeText, chatModelId); + const modelComposerTokens = countModelTokens(composeText, chatModelId); + const modelRestOfChatTokens = 0; + const estimatedTokens = modelComposerTokens + modelRestOfChatTokens; + const modelContextTokens = ChatModels[chatModelId]?.contextWindowSize || 8192; + const remainingTokens = modelContextTokens - estimatedTokens - modelMaxResponseTokens; + const tokensString = `model: ${modelContextTokens.toLocaleString()} - chat: ${estimatedTokens.toLocaleString()} - response: ${modelMaxResponseTokens.toLocaleString()} = remaining: ${remainingTokens.toLocaleString()} ${remainingTokens < 0 ? '⚠️' : ''}`; + const tokenColor = remainingTokens < 1 ? 'danger' : remainingTokens < modelComposerTokens / 4 ? 'warning' : 'primary'; return ( @@ -252,8 +260,8 @@ export function Composer(props: { disableSend: boolean; isDeveloperMode: boolean = (8192 - 2048) ? 'danger' : estimatedTokens >= (4097 - 2048) ? 'warning' : 'primary'} - badgeContent={estimatedTokens} + badgeContent={estimatedTokens > 0 ? {estimatedTokens} : 0} + color={tokenColor} sx={{ position: 'absolute', bottom: 8, right: 8, }} diff --git a/components/dialogs/SettingsModal.tsx b/components/dialogs/SettingsModal.tsx index 30adb8747..39947f5ef 100644 --- a/components/dialogs/SettingsModal.tsx +++ b/components/dialogs/SettingsModal.tsx @@ -54,11 +54,11 @@ function Section(props: { title?: string; collapsible?: boolean, collapsed?: boo */ export function SettingsModal({ open, onClose }: { open: boolean, onClose: () => void; }) { // external state - const { renderMarkdown, setRenderMarkdown, apiKey, setApiKey, modelTemperature, setModelTemperature, modelMaxTokens, setModelMaxTokens, modelApiHost, setModelApiHost } = useSettingsStore(state => ({ + const { renderMarkdown, setRenderMarkdown, apiKey, setApiKey, modelTemperature, setModelTemperature, modelMaxResponseTokens, setModelMaxResponseTokens, modelApiHost, setModelApiHost } = useSettingsStore(state => ({ renderMarkdown: state.renderMarkdown, setRenderMarkdown: state.setRenderMarkdown, apiKey: state.apiKey, setApiKey: state.setApiKey, modelTemperature: state.modelTemperature, setModelTemperature: state.setModelTemperature, - modelMaxTokens: state.modelMaxTokens, setModelMaxTokens: state.setModelMaxTokens, + modelMaxResponseTokens: state.modelMaxResponseTokens, setModelMaxResponseTokens: state.setModelMaxResponseTokens, modelApiHost: state.modelApiHost, setModelApiHost: state.setModelApiHost, }), shallow); @@ -70,7 +70,7 @@ export function SettingsModal({ open, onClose }: { open: boolean, onClose: () => const handleTemperatureChange = (event: Event, newValue: number | number[]) => setModelTemperature(newValue as number); - const handleMaxTokensChange = (event: Event, newValue: number | number[]) => setModelMaxTokens(newValue as number); + const handleMaxTokensChange = (event: Event, newValue: number | number[]) => setModelMaxResponseTokens(newValue as number); const handleModelApiHostChange = (e: React.ChangeEvent) => setModelApiHost((e.target as HTMLInputElement).value); @@ -153,7 +153,7 @@ export function SettingsModal({ open, onClose }: { open: boolean, onClose: () => diff --git a/docs/feature_token_counter.png b/docs/feature_token_counter.png new file mode 100644 index 0000000000000000000000000000000000000000..51b39cbf920a6b102fcb2d2a75f2088a66075487 GIT binary patch literal 8779 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 k@t^nnzgH44KI7q<{|hd|xZ{H#06|caQ void; - modelMaxTokens: number; - setModelMaxTokens: (modelMaxTokens: number) => void; + modelMaxResponseTokens: number; + setModelMaxResponseTokens: (modelMaxResponseTokens: number) => void; } @@ -65,8 +65,8 @@ export const useSettingsStore = create()( modelTemperature: 0.5, setModelTemperature: (modelTemperature: number) => set({ modelTemperature }), - modelMaxTokens: 2048, - setModelMaxTokens: (modelMaxTokens: number) => set({ modelMaxTokens }), + modelMaxResponseTokens: 2048, + setModelMaxResponseTokens: (modelMaxResponseTokens: number) => set({ modelMaxResponseTokens: modelMaxResponseTokens }), }), {