diff --git a/src/lib/ChatRequest.svelte b/src/lib/ChatRequest.svelte index 25069ce..c69f5dd 100644 --- a/src/lib/ChatRequest.svelte +++ b/src/lib/ChatRequest.svelte @@ -3,7 +3,7 @@ import { mergeProfileFields, prepareSummaryPrompt } from './Profiles.svelte' import { countMessageTokens, countPromptTokens, getModelMaxTokens } from './Stats.svelte' import type { Chat, ChatCompletionOpts, ChatSettings, Message, Model, Request, RequestImageGeneration } from './Types.svelte' - import { deleteMessage, getChatSettingValueNullDefault, insertMessages, getApiKey, addError, currentChatMessages, getMessages, updateMessages } from './Storage.svelte' + import { deleteMessage, getChatSettingValueNullDefault, insertMessages, getApiKey, addError, currentChatMessages, getMessages, updateMessages, deleteSummaryMessage } from './Storage.svelte' import { scrollToBottom, scrollToMessage } from './Util.svelte' import { getRequestSettingList, defaultModel } from './Settings.svelte' import { EventStreamContentType, fetchEventSource } from '@microsoft/fetch-event-source' @@ -418,7 +418,9 @@ export class ChatRequest { const summarizedIds = rw.map(m => m.uuid) const summaryIds = [summaryResponse.uuid] let loopCount = 0 + let networkRetry = 2 // number of retries on network error while (continueCounter-- > 0) { + let error = false try { const summary = await _this.sendRequest(top.concat(rw).concat([summaryRequest]).concat(loopCount > 0 ? [summaryResponse] : []), { summaryRequest: true, @@ -430,7 +432,7 @@ export class ChatRequest { if (opts.streaming) scrollToMessage(summaryResponse.uuid, 150, true, true) } } as ChatCompletionOpts, { - temperature: 0.1, // make summary more deterministic + temperature: chatSettings.summaryTemperature, // make summary more deterministic top_p: 1, presence_penalty: 0, frequency_penalty: 0, @@ -445,30 +447,35 @@ export class ChatRequest { deleteMessage(chatId, srid) return summary } - // Looks like we got our summarized messages. - // Mark the new summaries as such - // Need more? - if (summaryResponse.finish_reason === 'length' && continueCounter > 0) { - // Our summary was truncated - // Try to get more of it - delete summaryResponse.finish_reason - _this.updatingMessage = 'Summarizing more...' - let _recount = countPromptTokens(top.concat(rw).concat([summaryRequest]).concat([summaryResponse]), model) - while (rw.length && (_recount + maxSummaryTokens >= maxTokens)) { - rw.shift() - _recount = countPromptTokens(top.concat(rw).concat([summaryRequest]).concat([summaryResponse]), model) - } - loopCount++ - continue - } else { - // We're done - continueCounter = 0 - } } catch (e) { - _this.updating = false - _this.updatingMessage = '' - deleteMessage(chatId, srid) - throw e + if (e.message?.includes('network error') && networkRetry > 0) { + networkRetry-- + error = true + } else { + _this.updating = false + _this.updatingMessage = '' + deleteSummaryMessage(chatId, srid) + throw e + } + } + // Looks like we got our summarized messages. + // Mark the new summaries as such + // Need more? + if ((error || summaryResponse.finish_reason === 'length') && continueCounter > 0) { + // Our summary was truncated + // Try to get more of it + delete summaryResponse.finish_reason + _this.updatingMessage = 'Summarizing more...' + let _recount = countPromptTokens(top.concat(rw).concat([summaryRequest]).concat([summaryResponse]), model) + while (rw.length && (_recount + maxSummaryTokens >= maxTokens)) { + rw.shift() + _recount = countPromptTokens(top.concat(rw).concat([summaryRequest]).concat([summaryResponse]), model) + } + loopCount++ + continue + } else { + // We're done + continueCounter = 0 } } summaryResponse.summary = summarizedIds diff --git a/src/lib/EditMessage.svelte b/src/lib/EditMessage.svelte index 58b45ae..39c527e 100644 --- a/src/lib/EditMessage.svelte +++ b/src/lib/EditMessage.svelte @@ -70,6 +70,7 @@ const doChange = () => { if (message.content !== original) { dispatch('change', message) + updateMessages(chatId) } } diff --git a/src/lib/Settings.svelte b/src/lib/Settings.svelte index d732417..5243629 100644 --- a/src/lib/Settings.svelte +++ b/src/lib/Settings.svelte @@ -78,6 +78,7 @@ const defaults:ChatSettings = { summaryThreshold: 3000, summarySize: 1000, summaryExtend: 0, + summaryTemperature: 0.1, pinTop: 0, pinBottom: 6, summaryPrompt: '', @@ -247,6 +248,16 @@ const summarySettings: ChatSetting[] = [ ], hide: (chatId) => getChatSettings(chatId).continuousChat !== 'summary' }, + { + key: 'summaryTemperature', + name: 'Summary Temperature', + title: 'What sampling temperature to use, between 0 and 2, when generating summary. Lower values, like 0, will be more deterministic.', + min: 0, + max: 2, + step: 0.1, + type: 'number', + hide: (chatId) => getChatSettings(chatId).continuousChat !== 'summary' + }, { key: 'pinTop', name: 'Keep First Prompts', diff --git a/src/lib/Storage.svelte b/src/lib/Storage.svelte index 0818655..bebd2aa 100644 --- a/src/lib/Storage.svelte +++ b/src/lib/Storage.svelte @@ -235,18 +235,19 @@ }, 10) } - let setMessagesTimer: any + const setMessagesTimers: any = {} export const setMessages = (chatId: number, messages: Message[]) => { if (get(currentChatId) === chatId) { // update current message cache right away currentChatMessages.set(messages) - clearTimeout(setMessagesTimer) + clearTimeout(setMessagesTimers[chatId]) // delay expensive all chats update for a bit - setMessagesTimer = setTimeout(() => { + setMessagesTimers[chatId] = setTimeout(() => { getChat(chatId).messages = messages saveChatStore() }, 200) } else { + clearTimeout(setMessagesTimers[chatId]) getChat(chatId).messages = messages saveChatStore() } diff --git a/src/lib/Types.svelte b/src/lib/Types.svelte index f944556..be81424 100644 --- a/src/lib/Types.svelte +++ b/src/lib/Types.svelte @@ -86,6 +86,7 @@ summaryThreshold: number; summarySize: number; summaryExtend: number; + summaryTemperature: number; pinTop: number; pinBottom: number; summaryPrompt: string;