+
diff --git a/app/locales/ar.ts b/app/locales/ar.ts
index 9bd491083e4..464519e2055 100644
--- a/app/locales/ar.ts
+++ b/app/locales/ar.ts
@@ -43,6 +43,8 @@ const ar: PartialLocaleType = {
PinToastAction: "عرض",
Delete: "حذف",
Edit: "تحرير",
+ RefreshTitle: "تحديث العنوان",
+ RefreshToast: "تم إرسال طلب تحديث العنوان",
},
Commands: {
new: "دردشة جديدة",
@@ -404,6 +406,10 @@ const ar: PartialLocaleType = {
},
Model: "النموذج",
+ CompressModel: {
+ Title: "نموذج الضغط",
+ SubTitle: "النموذج المستخدم لضغط السجل التاريخي",
+ },
Temperature: {
Title: "العشوائية (temperature)",
SubTitle: "كلما زادت القيمة، زادت العشوائية في الردود",
diff --git a/app/locales/bn.ts b/app/locales/bn.ts
index acabc8e2ad4..945c442df57 100644
--- a/app/locales/bn.ts
+++ b/app/locales/bn.ts
@@ -43,6 +43,8 @@ const bn: PartialLocaleType = {
PinToastAction: "দেখুন",
Delete: "মুছে ফেলুন",
Edit: "সম্পাদনা করুন",
+ RefreshTitle: "শিরোনাম রিফ্রেশ করুন",
+ RefreshToast: "শিরোনাম রিফ্রেশ অনুরোধ পাঠানো হয়েছে",
},
Commands: {
new: "নতুন চ্যাট",
@@ -411,6 +413,10 @@ const bn: PartialLocaleType = {
},
Model: "মডেল (model)",
+ CompressModel: {
+ Title: "সংকোচন মডেল",
+ SubTitle: "ইতিহাস সংকুচিত করার জন্য ব্যবহৃত মডেল",
+ },
Temperature: {
Title: "যাদুকরিতা (temperature)",
SubTitle: "মান বাড়ালে উত্তর বেশি এলোমেলো হবে",
diff --git a/app/locales/cn.ts b/app/locales/cn.ts
index 92e81bcb1ba..fcbdb6f627c 100644
--- a/app/locales/cn.ts
+++ b/app/locales/cn.ts
@@ -44,6 +44,8 @@ const cn = {
Delete: "删除",
Edit: "编辑",
FullScreen: "全屏",
+ RefreshTitle: "刷新标题",
+ RefreshToast: "已发送刷新标题请求",
},
Commands: {
new: "新建聊天",
@@ -470,6 +472,10 @@ const cn = {
},
Model: "模型 (model)",
+ CompressModel: {
+ Title: "压缩模型",
+ SubTitle: "用于压缩历史记录的模型",
+ },
Temperature: {
Title: "随机性 (temperature)",
SubTitle: "值越大,回复越随机",
diff --git a/app/locales/cs.ts b/app/locales/cs.ts
index d16c474e824..5a132b3ce6d 100644
--- a/app/locales/cs.ts
+++ b/app/locales/cs.ts
@@ -43,6 +43,8 @@ const cs: PartialLocaleType = {
PinToastAction: "Zobrazit",
Delete: "Smazat",
Edit: "Upravit",
+ RefreshTitle: "Obnovit název",
+ RefreshToast: "Požadavek na obnovení názvu byl odeslán",
},
Commands: {
new: "Nová konverzace",
@@ -410,6 +412,10 @@ const cs: PartialLocaleType = {
},
Model: "Model (model)",
+ CompressModel: {
+ Title: "Kompresní model",
+ SubTitle: "Model používaný pro kompresi historie",
+ },
Temperature: {
Title: "Náhodnost (temperature)",
SubTitle: "Čím vyšší hodnota, tím náhodnější odpovědi",
diff --git a/app/locales/de.ts b/app/locales/de.ts
index a1f81704726..ebe7aff2d71 100644
--- a/app/locales/de.ts
+++ b/app/locales/de.ts
@@ -43,6 +43,8 @@ const de: PartialLocaleType = {
PinToastAction: "Ansehen",
Delete: "Löschen",
Edit: "Bearbeiten",
+ RefreshTitle: "Titel aktualisieren",
+ RefreshToast: "Anfrage zur Titelaktualisierung gesendet",
},
Commands: {
new: "Neues Gespräch",
@@ -421,6 +423,10 @@ const de: PartialLocaleType = {
},
Model: "Modell",
+ CompressModel: {
+ Title: "Kompressionsmodell",
+ SubTitle: "Modell zur Komprimierung des Verlaufs",
+ },
Temperature: {
Title: "Zufälligkeit (temperature)",
SubTitle: "Je höher der Wert, desto zufälliger die Antwort",
diff --git a/app/locales/en.ts b/app/locales/en.ts
index 09b76f1fa12..049447569f7 100644
--- a/app/locales/en.ts
+++ b/app/locales/en.ts
@@ -45,6 +45,8 @@ const en: LocaleType = {
Delete: "Delete",
Edit: "Edit",
FullScreen: "FullScreen",
+ RefreshTitle: "Refresh Title",
+ RefreshToast: "Title refresh request sent",
},
Commands: {
new: "Start a new chat",
@@ -474,6 +476,10 @@ const en: LocaleType = {
},
Model: "Model",
+ CompressModel: {
+ Title: "Compression Model",
+ SubTitle: "Model used to compress history",
+ },
Temperature: {
Title: "Temperature",
SubTitle: "A larger value makes the more random output",
diff --git a/app/locales/es.ts b/app/locales/es.ts
index 5e4f900b70f..c1caae2d385 100644
--- a/app/locales/es.ts
+++ b/app/locales/es.ts
@@ -44,6 +44,8 @@ const es: PartialLocaleType = {
PinToastAction: "Ver",
Delete: "Eliminar",
Edit: "Editar",
+ RefreshTitle: "Actualizar título",
+ RefreshToast: "Se ha enviado la solicitud de actualización del título",
},
Commands: {
new: "Nueva conversación",
@@ -423,6 +425,10 @@ const es: PartialLocaleType = {
},
Model: "Modelo (model)",
+ CompressModel: {
+ Title: "Modelo de compresión",
+ SubTitle: "Modelo utilizado para comprimir el historial",
+ },
Temperature: {
Title: "Aleatoriedad (temperature)",
SubTitle: "Cuanto mayor sea el valor, más aleatorio será el resultado",
diff --git a/app/locales/fr.ts b/app/locales/fr.ts
index 65efc32b8d6..97fb79e3238 100644
--- a/app/locales/fr.ts
+++ b/app/locales/fr.ts
@@ -43,6 +43,8 @@ const fr: PartialLocaleType = {
PinToastAction: "Voir",
Delete: "Supprimer",
Edit: "Modifier",
+ RefreshTitle: "Actualiser le titre",
+ RefreshToast: "Demande d'actualisation du titre envoyée",
},
Commands: {
new: "Nouvelle discussion",
@@ -422,6 +424,10 @@ const fr: PartialLocaleType = {
},
Model: "Modèle",
+ CompressModel: {
+ Title: "Modèle de compression",
+ SubTitle: "Modèle utilisé pour compresser l'historique",
+ },
Temperature: {
Title: "Aléatoire (temperature)",
SubTitle: "Plus la valeur est élevée, plus les réponses sont aléatoires",
diff --git a/app/locales/id.ts b/app/locales/id.ts
index 3ac7af49006..1eff667ed9e 100644
--- a/app/locales/id.ts
+++ b/app/locales/id.ts
@@ -43,6 +43,8 @@ const id: PartialLocaleType = {
PinToastAction: "Lihat",
Delete: "Hapus",
Edit: "Edit",
+ RefreshTitle: "Segarkan Judul",
+ RefreshToast: "Permintaan penyegaran judul telah dikirim",
},
Commands: {
new: "Obrolan Baru",
@@ -411,6 +413,10 @@ const id: PartialLocaleType = {
},
Model: "Model",
+ CompressModel: {
+ Title: "Model Kompresi",
+ SubTitle: "Model yang digunakan untuk mengompres riwayat",
+ },
Temperature: {
Title: "Randomness (temperature)",
SubTitle: "Semakin tinggi nilainya, semakin acak responsnya",
diff --git a/app/locales/it.ts b/app/locales/it.ts
index 1a54cfa43ed..9b0d965d351 100644
--- a/app/locales/it.ts
+++ b/app/locales/it.ts
@@ -43,6 +43,8 @@ const it: PartialLocaleType = {
PinToastAction: "Visualizza",
Delete: "Elimina",
Edit: "Modifica",
+ RefreshTitle: "Aggiorna titolo",
+ RefreshToast: "Richiesta di aggiornamento del titolo inviata",
},
Commands: {
new: "Nuova chat",
@@ -423,6 +425,10 @@ const it: PartialLocaleType = {
},
Model: "Modello (model)",
+ CompressModel: {
+ Title: "Modello di compressione",
+ SubTitle: "Modello utilizzato per comprimere la cronologia",
+ },
Temperature: {
Title: "Casualità (temperature)",
SubTitle: "Valore più alto, risposte più casuali",
diff --git a/app/locales/jp.ts b/app/locales/jp.ts
index 6aaf0ba6737..1511afc2c5f 100644
--- a/app/locales/jp.ts
+++ b/app/locales/jp.ts
@@ -43,6 +43,8 @@ const jp: PartialLocaleType = {
PinToastAction: "見る",
Delete: "削除",
Edit: "編集",
+ RefreshTitle: "タイトルを更新",
+ RefreshToast: "タイトル更新リクエストが送信されました",
},
Commands: {
new: "新しいチャット",
@@ -407,6 +409,10 @@ const jp: PartialLocaleType = {
},
Model: "モデル (model)",
+ CompressModel: {
+ Title: "圧縮モデル",
+ SubTitle: "履歴を圧縮するために使用されるモデル",
+ },
Temperature: {
Title: "ランダム性 (temperature)",
SubTitle: "値が大きいほど応答がランダムになります",
diff --git a/app/locales/ko.ts b/app/locales/ko.ts
index 563827fb966..11e6aa4eb29 100644
--- a/app/locales/ko.ts
+++ b/app/locales/ko.ts
@@ -43,6 +43,8 @@ const ko: PartialLocaleType = {
PinToastAction: "보기",
Delete: "삭제",
Edit: "편집",
+ RefreshTitle: "제목 새로고침",
+ RefreshToast: "제목 새로고침 요청이 전송되었습니다",
},
Commands: {
new: "새 채팅",
@@ -404,6 +406,10 @@ const ko: PartialLocaleType = {
},
Model: "모델 (model)",
+ CompressModel: {
+ Title: "압축 모델",
+ SubTitle: "기록을 압축하는 데 사용되는 모델",
+ },
Temperature: {
Title: "무작위성 (temperature)",
SubTitle: "값이 클수록 응답이 더 무작위적",
diff --git a/app/locales/no.ts b/app/locales/no.ts
index d7dc16b3fe1..6fc8e86c787 100644
--- a/app/locales/no.ts
+++ b/app/locales/no.ts
@@ -44,6 +44,8 @@ const no: PartialLocaleType = {
PinToastAction: "Se",
Delete: "Slett",
Edit: "Rediger",
+ RefreshTitle: "Oppdater tittel",
+ RefreshToast: "Forespørsel om titteloppdatering sendt",
},
Commands: {
new: "Ny samtale",
@@ -415,6 +417,10 @@ const no: PartialLocaleType = {
},
Model: "Modell",
+ CompressModel: {
+ Title: "Komprimeringsmodell",
+ SubTitle: "Modell brukt for å komprimere historikken",
+ },
Temperature: {
Title: "Tilfeldighet (temperature)",
SubTitle: "Høyere verdi gir mer tilfeldige svar",
diff --git a/app/locales/pt.ts b/app/locales/pt.ts
index 9fd13ba1cba..c04081a8b36 100644
--- a/app/locales/pt.ts
+++ b/app/locales/pt.ts
@@ -43,6 +43,8 @@ const pt: PartialLocaleType = {
PinToastAction: "Visualizar",
Delete: "Deletar",
Edit: "Editar",
+ RefreshTitle: "Atualizar Título",
+ RefreshToast: "Solicitação de atualização de título enviada",
},
Commands: {
new: "Iniciar um novo chat",
@@ -346,6 +348,10 @@ const pt: PartialLocaleType = {
},
Model: "Modelo",
+ CompressModel: {
+ Title: "Modelo de Compressão",
+ SubTitle: "Modelo usado para comprimir o histórico",
+ },
Temperature: {
Title: "Temperatura",
SubTitle: "Um valor maior torna a saída mais aleatória",
diff --git a/app/locales/ru.ts b/app/locales/ru.ts
index e983dcddbda..0fcf73a249f 100644
--- a/app/locales/ru.ts
+++ b/app/locales/ru.ts
@@ -43,6 +43,8 @@ const ru: PartialLocaleType = {
PinToastAction: "Просмотреть",
Delete: "Удалить",
Edit: "Редактировать",
+ RefreshTitle: "Обновить заголовок",
+ RefreshToast: "Запрос на обновление заголовка отправлен",
},
Commands: {
new: "Новый чат",
@@ -414,6 +416,10 @@ const ru: PartialLocaleType = {
},
Model: "Модель",
+ CompressModel: {
+ Title: "Модель сжатия",
+ SubTitle: "Модель, используемая для сжатия истории",
+ },
Temperature: {
Title: "Случайность (temperature)",
SubTitle: "Чем больше значение, тем более случайные ответы",
diff --git a/app/locales/sk.ts b/app/locales/sk.ts
index 2586aaaa7b4..8f83c3ba73a 100644
--- a/app/locales/sk.ts
+++ b/app/locales/sk.ts
@@ -45,6 +45,8 @@ const sk: PartialLocaleType = {
PinToastAction: "Zobraziť",
Delete: "Vymazať",
Edit: "Upraviť",
+ RefreshTitle: "Obnoviť názov",
+ RefreshToast: "Požiadavka na obnovenie názvu bola odoslaná",
},
Commands: {
new: "Začať nový chat",
@@ -365,6 +367,10 @@ const sk: PartialLocaleType = {
},
Model: "Model",
+ CompressModel: {
+ Title: "Kompresný model",
+ SubTitle: "Model používaný na kompresiu histórie",
+ },
Temperature: {
Title: "Teplota",
SubTitle: "Vyššia hodnota robí výstup náhodnejším",
diff --git a/app/locales/tr.ts b/app/locales/tr.ts
index ac410615e74..b7f14104750 100644
--- a/app/locales/tr.ts
+++ b/app/locales/tr.ts
@@ -43,6 +43,8 @@ const tr: PartialLocaleType = {
PinToastAction: "Görünüm",
Delete: "Sil",
Edit: "Düzenle",
+ RefreshTitle: "Başlığı Yenile",
+ RefreshToast: "Başlık yenileme isteği gönderildi",
},
Commands: {
new: "Yeni sohbet",
@@ -414,6 +416,10 @@ const tr: PartialLocaleType = {
},
Model: "Model (model)",
+ CompressModel: {
+ Title: "Sıkıştırma Modeli",
+ SubTitle: "Geçmişi sıkıştırmak için kullanılan model",
+ },
Temperature: {
Title: "Rastgelelik (temperature)",
SubTitle: "Değer arttıkça yanıt daha rastgele olur",
diff --git a/app/locales/tw.ts b/app/locales/tw.ts
index c54a7b8c5ae..b0602a08174 100644
--- a/app/locales/tw.ts
+++ b/app/locales/tw.ts
@@ -43,6 +43,8 @@ const tw = {
PinToastAction: "檢視",
Delete: "刪除",
Edit: "編輯",
+ RefreshTitle: "刷新標題",
+ RefreshToast: "已發送刷新標題請求",
},
Commands: {
new: "新建聊天",
@@ -368,6 +370,10 @@ const tw = {
},
Model: "模型 (model)",
+ CompressModel: {
+ Title: "壓縮模型",
+ SubTitle: "用於壓縮歷史記錄的模型",
+ },
Temperature: {
Title: "隨機性 (temperature)",
SubTitle: "值越大,回應越隨機",
diff --git a/app/locales/vi.ts b/app/locales/vi.ts
index 9a21ee406f8..1f20e15a0b1 100644
--- a/app/locales/vi.ts
+++ b/app/locales/vi.ts
@@ -43,6 +43,8 @@ const vi: PartialLocaleType = {
PinToastAction: "Xem",
Delete: "Xóa",
Edit: "Chỉnh sửa",
+ RefreshTitle: "Làm mới tiêu đề",
+ RefreshToast: "Đã gửi yêu cầu làm mới tiêu đề",
},
Commands: {
new: "Tạo cuộc trò chuyện mới",
@@ -410,6 +412,10 @@ const vi: PartialLocaleType = {
},
Model: "Mô hình (model)",
+ CompressModel: {
+ Title: "Mô hình nén",
+ SubTitle: "Mô hình được sử dụng để nén lịch sử",
+ },
Temperature: {
Title: "Độ ngẫu nhiên (temperature)",
SubTitle: "Giá trị càng lớn, câu trả lời càng ngẫu nhiên",
diff --git a/app/store/chat.ts b/app/store/chat.ts
index 58c105e7ef7..3bcda75389a 100644
--- a/app/store/chat.ts
+++ b/app/store/chat.ts
@@ -1,33 +1,29 @@
-import { trimTopic, getMessageTextContent } from "../utils";
+import { getMessageTextContent, trimTopic } from "../utils";
-import Locale, { getLang } from "../locales";
+import { indexedDBStorage } from "@/app/utils/indexedDB-storage";
+import { nanoid } from "nanoid";
+import type {
+ ClientApi,
+ MultimodalContent,
+ RequestMessage,
+} from "../client/api";
+import { getClientApi } from "../client/api";
+import { ChatControllerPool } from "../client/controller";
import { showToast } from "../components/ui-lib";
-import { ModelConfig, ModelType, useAppConfig } from "./config";
-import { createEmptyMask, Mask } from "./mask";
import {
DEFAULT_INPUT_TEMPLATE,
DEFAULT_MODELS,
DEFAULT_SYSTEM_TEMPLATE,
KnowledgeCutOffDate,
StoreKey,
- SUMMARIZE_MODEL,
- GEMINI_SUMMARIZE_MODEL,
} from "../constant";
-import { getClientApi } from "../client/api";
-import type {
- ClientApi,
- RequestMessage,
- MultimodalContent,
-} from "../client/api";
-import { ChatControllerPool } from "../client/controller";
+import Locale, { getLang } from "../locales";
+import { isDalle3, safeLocalStorage } from "../utils";
import { prettyObject } from "../utils/format";
-import { estimateTokenLength } from "../utils/token";
-import { nanoid } from "nanoid";
import { createPersistStore } from "../utils/store";
-import { collectModelsWithDefaultModel } from "../utils/model";
-import { useAccessStore } from "./access";
-import { isDalle3, safeLocalStorage } from "../utils";
-import { indexedDBStorage } from "@/app/utils/indexedDB-storage";
+import { estimateTokenLength } from "../utils/token";
+import { ModelConfig, ModelType, useAppConfig } from "./config";
+import { createEmptyMask, Mask } from "./mask";
const localStorage = safeLocalStorage();
@@ -106,27 +102,6 @@ function createEmptySession(): ChatSession {
};
}
-function getSummarizeModel(currentModel: string) {
- // if it is using gpt-* models, force to use 4o-mini to summarize
- if (currentModel.startsWith("gpt") || currentModel.startsWith("chatgpt")) {
- const configStore = useAppConfig.getState();
- const accessStore = useAccessStore.getState();
- const allModel = collectModelsWithDefaultModel(
- configStore.models,
- [configStore.customModels, accessStore.customModels].join(","),
- accessStore.defaultModel,
- );
- const summarizeModel = allModel.find(
- (m) => m.name === SUMMARIZE_MODEL && m.available,
- );
- return summarizeModel?.name ?? currentModel;
- }
- if (currentModel.startsWith("gemini")) {
- return GEMINI_SUMMARIZE_MODEL;
- }
- return currentModel;
-}
-
function countMessages(msgs: ChatMessage[]) {
return msgs.reduce(
(pre, cur) => pre + estimateTokenLength(getMessageTextContent(cur)),
@@ -572,7 +547,7 @@ export const useChatStore = createPersistStore(
});
},
- summarizeSession() {
+ summarizeSession(refreshTitle: boolean = false) {
const config = useAppConfig.getState();
const session = get().currentSession();
const modelConfig = session.mask.modelConfig;
@@ -581,7 +556,7 @@ export const useChatStore = createPersistStore(
return;
}
- const providerName = modelConfig.providerName;
+ const providerName = modelConfig.compressProviderName;
const api: ClientApi = getClientApi(providerName);
// remove error messages if any
@@ -590,20 +565,30 @@ export const useChatStore = createPersistStore(
// should summarize topic after chating more than 50 words
const SUMMARIZE_MIN_LEN = 50;
if (
- config.enableAutoGenerateTitle &&
- session.topic === DEFAULT_TOPIC &&
- countMessages(messages) >= SUMMARIZE_MIN_LEN
+ (config.enableAutoGenerateTitle &&
+ session.topic === DEFAULT_TOPIC &&
+ countMessages(messages) >= SUMMARIZE_MIN_LEN) ||
+ refreshTitle
) {
- const topicMessages = messages.concat(
- createMessage({
- role: "user",
- content: Locale.Store.Prompt.Topic,
- }),
+ const startIndex = Math.max(
+ 0,
+ messages.length - modelConfig.historyMessageCount,
);
+ const topicMessages = messages
+ .slice(
+ startIndex < messages.length ? startIndex : messages.length - 1,
+ messages.length,
+ )
+ .concat(
+ createMessage({
+ role: "user",
+ content: Locale.Store.Prompt.Topic,
+ }),
+ );
api.llm.chat({
messages: topicMessages,
config: {
- model: getSummarizeModel(session.mask.modelConfig.model),
+ model: modelConfig.compressModel,
stream: false,
providerName,
},
@@ -666,7 +651,7 @@ export const useChatStore = createPersistStore(
config: {
...modelcfg,
stream: true,
- model: getSummarizeModel(session.mask.modelConfig.model),
+ model: modelConfig.compressModel,
},
onUpdate(message) {
session.memoryPrompt = message;
@@ -715,7 +700,7 @@ export const useChatStore = createPersistStore(
},
{
name: StoreKey.Chat,
- version: 3.1,
+ version: 3.2,
migrate(persistedState, version) {
const state = persistedState as any;
const newState = JSON.parse(
@@ -762,6 +747,16 @@ export const useChatStore = createPersistStore(
});
}
+ // add default summarize model for every session
+ if (version < 3.2) {
+ newState.sessions.forEach((s) => {
+ const config = useAppConfig.getState();
+ s.mask.modelConfig.compressModel = config.modelConfig.compressModel;
+ s.mask.modelConfig.compressProviderName =
+ config.modelConfig.compressProviderName;
+ });
+ }
+
return newState as any;
},
},
diff --git a/app/store/config.ts b/app/store/config.ts
index e8e3c9863ef..9985b9e768c 100644
--- a/app/store/config.ts
+++ b/app/store/config.ts
@@ -50,7 +50,7 @@ export const DEFAULT_CONFIG = {
models: DEFAULT_MODELS as any as LLMModel[],
modelConfig: {
- model: "gpt-3.5-turbo" as ModelType,
+ model: "gpt-4o-mini" as ModelType,
providerName: "OpenAI" as ServiceProvider,
temperature: 0.5,
top_p: 1,
@@ -60,6 +60,8 @@ export const DEFAULT_CONFIG = {
sendMemory: true,
historyMessageCount: 4,
compressMessageLengthThreshold: 1000,
+ compressModel: "gpt-4o-mini" as ModelType,
+ compressProviderName: "OpenAI" as ServiceProvider,
enableInjectSystemPrompts: true,
template: config?.template ?? DEFAULT_INPUT_TEMPLATE,
size: "1024x1024" as DalleSize,
@@ -140,7 +142,7 @@ export const useAppConfig = createPersistStore(
}),
{
name: StoreKey.Config,
- version: 3.9,
+ version: 4,
migrate(persistedState, version) {
const state = persistedState as ChatConfig;
@@ -178,6 +180,13 @@ export const useAppConfig = createPersistStore(
: config?.template ?? DEFAULT_INPUT_TEMPLATE;
}
+ if (version < 4) {
+ state.modelConfig.compressModel =
+ DEFAULT_CONFIG.modelConfig.compressModel;
+ state.modelConfig.compressProviderName =
+ DEFAULT_CONFIG.modelConfig.compressProviderName;
+ }
+
return state as any;
},
},