From 0e44a7ad4b2aae979d3b7bce6571160fc4d8ae88 Mon Sep 17 00:00:00 2001 From: n4ze3m Date: Wed, 2 Oct 2024 12:30:52 +0530 Subject: [PATCH] feat: Add temporary system prompt Adds a new setting that allows users to set a temporary system prompt for the current chat. This prompt will override the selected system prompt if it exists. The new setting is available in the "Current Chat Model Settings" modal. This feature provides a way to quickly experiment with different system prompts without having to change the default setting. --- src/assets/locale/de/common.json | 5 + src/assets/locale/en/common.json | 5 + src/assets/locale/es/common.json | 5 + src/assets/locale/fa/common.json | 5 + src/assets/locale/fr/common.json | 5 + src/assets/locale/it/common.json | 8 +- src/assets/locale/ja-JP/common.json | 5 + src/assets/locale/ml/common.json | 5 + src/assets/locale/pt-BR/common.json | 5 + src/assets/locale/ru/common.json | 8 +- src/assets/locale/zh/common.json | 5 + .../Settings/CurrentChatModelSettings.tsx | 262 +++++++++++------- src/components/Layouts/Layout.tsx | 1 + src/hooks/useMessageOption.tsx | 21 +- src/store/model.tsx | 7 +- 15 files changed, 240 insertions(+), 112 deletions(-) diff --git a/src/assets/locale/de/common.json b/src/assets/locale/de/common.json index 2fc2e70..0444973 100644 --- a/src/assets/locale/de/common.json +++ b/src/assets/locale/de/common.json @@ -85,6 +85,11 @@ "numGpu": { "label": "Anzahl GPUs", "placeholder": "Geben Sie die Anzahl der Ebenen ein, die an GPU(s) gesendet werden sollen" + }, + "systemPrompt": { + "label": "Temporärer System-Prompt", + "placeholder": "System-Prompt eingeben", + "help": "Dies ist eine schnelle Möglichkeit, den System-Prompt im aktuellen Chat festzulegen, der den ausgewählten System-Prompt überschreibt, falls vorhanden." } }, "advanced": "Weitere Modell-Einstellungen" diff --git a/src/assets/locale/en/common.json b/src/assets/locale/en/common.json index fe6fae2..28be4d1 100644 --- a/src/assets/locale/en/common.json +++ b/src/assets/locale/en/common.json @@ -85,6 +85,11 @@ "numGpu": { "label": "Num GPU", "placeholder": "Enter number of layers to send to GPU(s)" + }, + "systemPrompt": { + "label": "Temporary System Prompt", + "placeholder": "Enter System Prompt", + "help": "This is a quick way to set the system prompt in the current chat, which will override the selected system prompt if it exists." } }, "advanced": "More Model Settings" diff --git a/src/assets/locale/es/common.json b/src/assets/locale/es/common.json index 37378d6..33dd76a 100644 --- a/src/assets/locale/es/common.json +++ b/src/assets/locale/es/common.json @@ -85,6 +85,11 @@ "numGpu": { "label": "Num GPU", "placeholder": "Ingrese el número de capas para enviar a la(s) GPU(s)" + }, + "systemPrompt": { + "label": "Prompt de Sistema Temporal", + "placeholder": "Ingrese el Prompt de Sistema", + "help": "Esta es una forma rápida de establecer el prompt de sistema en el chat actual, que anulará el prompt de sistema seleccionado si existe." } }, "advanced": "Más Configuraciones del Modelo" diff --git a/src/assets/locale/fa/common.json b/src/assets/locale/fa/common.json index 7ea892f..1dd3ddd 100644 --- a/src/assets/locale/fa/common.json +++ b/src/assets/locale/fa/common.json @@ -85,6 +85,11 @@ "numGpu": { "label": "Num GPU", "placeholder": "تعداد لایه‌هایی که به GPU(ها) ارسال می‌شود را وارد کنید" + }, + "systemPrompt": { + "label": "پرامپت سیستم موقت", + "placeholder": "پرامپت سیستم را وارد کنید", + "help": "این یک روش سریع برای تنظیم پرامپت سیستم در گفتگوی فعلی است که در صورت وجود، پرامپت سیستم انتخاب شده را لغو خواهد کرد." } }, "advanced": "تنظیمات بیشتر مدل" diff --git a/src/assets/locale/fr/common.json b/src/assets/locale/fr/common.json index 5300406..03cd970 100644 --- a/src/assets/locale/fr/common.json +++ b/src/assets/locale/fr/common.json @@ -85,6 +85,11 @@ "numGpu": { "label": "Num GPU", "placeholder": "Entrez le nombre de couches à envoyer au(x) GPU(s)" + }, + "systemPrompt": { + "label": "Invite système temporaire", + "placeholder": "Entrez l'invite système", + "help": "C'est un moyen rapide de définir l'invite système dans le chat actuel, qui remplacera l'invite système sélectionnée si elle existe." } }, "advanced": "Plus de paramètres du modèle" diff --git a/src/assets/locale/it/common.json b/src/assets/locale/it/common.json index 45f0dee..6e7cd38 100644 --- a/src/assets/locale/it/common.json +++ b/src/assets/locale/it/common.json @@ -84,7 +84,13 @@ }, "numGpu": { "label": "Num GPU", - "placeholder": "Inserisci il numero di layer da inviare alla/e GPU" } + "placeholder": "Inserisci il numero di layer da inviare alla/e GPU" + }, + "systemPrompt": { + "label": "Prompt di Sistema Temporaneo", + "placeholder": "Inserisci il Prompt di Sistema", + "help": "Questo è un modo rapido per impostare il prompt di sistema nella chat corrente, che sovrascriverà il prompt di sistema selezionato se esiste." + } }, "advanced": "Altre Impostazioni del Modello" }, diff --git a/src/assets/locale/ja-JP/common.json b/src/assets/locale/ja-JP/common.json index 254c40e..4bb7061 100644 --- a/src/assets/locale/ja-JP/common.json +++ b/src/assets/locale/ja-JP/common.json @@ -85,6 +85,11 @@ "numGpu": { "label": "Num GPU", "placeholder": "GPU(s)に送信するレイヤー数を入力してください" + }, + "systemPrompt": { + "label": "一時的なシステムプロンプト", + "placeholder": "システムプロンプトを入力", + "help": "これは現在のチャットでシステムプロンプトを素早く設定する方法で、選択されたシステムプロンプトが存在する場合はそれを上書きします。" } }, "advanced": "その他のモデル設定" diff --git a/src/assets/locale/ml/common.json b/src/assets/locale/ml/common.json index 7e94f1a..9f00717 100644 --- a/src/assets/locale/ml/common.json +++ b/src/assets/locale/ml/common.json @@ -84,6 +84,11 @@ "numGpu": { "label": "ജിപിയു എണ്ണം", "placeholder": "ജിപിയു(കൾ)ക്ക് അയക്കേണ്ട ലേയറുകളുടെ എണ്ണം നൽകുക" + }, + "systemPrompt": { + "label": "താൽക്കാലിക സിസ്റ്റം പ്രോംപ്റ്റ്", + "placeholder": "സിസ്റ്റം പ്രോംപ്റ്റ് നൽകുക", + "help": "നിലവിലുള്ള ചാറ്റിൽ സിസ്റ്റം പ്രോംപ്റ്റ് സെറ്റ് ചെയ്യാനുള്ള വേഗത്തിലുള്ള മാർഗമാണിത്, ഇത് തിരഞ്ഞെടുത്ത സിസ്റ്റം പ്രോംപ്റ്റ് നിലവിലുണ്ടെങ്കിൽ അതിനെ മറികടക്കും." } }, "advanced": "കൂടുതൽ മോഡൽ ക്രമീകരണങ്ങൾ" diff --git a/src/assets/locale/pt-BR/common.json b/src/assets/locale/pt-BR/common.json index 0fa9e3f..c09c1b4 100644 --- a/src/assets/locale/pt-BR/common.json +++ b/src/assets/locale/pt-BR/common.json @@ -85,6 +85,11 @@ "numGpu": { "label": "Num GPUs", "placeholder": "Digite o número de camadas para enviar para a(s) GPU(s)" + }, + "systemPrompt": { + "label": "Prompt do Sistema Temporário", + "placeholder": "Digite o Prompt do Sistema", + "help": "Esta é uma maneira rápida de definir o prompt do sistema no chat atual, que substituirá o prompt do sistema selecionado, se existir." } }, "advanced": "Mais Configurações do Modelo" diff --git a/src/assets/locale/ru/common.json b/src/assets/locale/ru/common.json index 77d423b..582896c 100644 --- a/src/assets/locale/ru/common.json +++ b/src/assets/locale/ru/common.json @@ -84,7 +84,13 @@ }, "numGpu": { "label": "Num GPU", - "placeholder": "Введите количество слоев для отправки на GPU" } + "placeholder": "Введите количество слоев для отправки на GPU" + }, + "systemPrompt": { + "label": "Временный системный запрос", + "placeholder": "Введите системный запрос", + "help": "Это быстрый способ установить системный запрос в текущем чате, который переопределит выбранный системный запрос, если он существует." + } }, "advanced": "Больше настроек модели" }, diff --git a/src/assets/locale/zh/common.json b/src/assets/locale/zh/common.json index eda9d1b..ddb08b4 100644 --- a/src/assets/locale/zh/common.json +++ b/src/assets/locale/zh/common.json @@ -85,6 +85,11 @@ "numGpu": { "label": "Num GPU", "placeholder": "输入要发送到 GPU 的层数" + }, + "systemPrompt": { + "label": "临时系统提示", + "placeholder": "输入系统提示", + "help": "这是一种在当前聊天中快速设置系统提示的方法,如果存在已选择的系统提示,它将覆盖该提示。" } }, "advanced": "更多模型设置" diff --git a/src/components/Common/Settings/CurrentChatModelSettings.tsx b/src/components/Common/Settings/CurrentChatModelSettings.tsx index 147b232..3e5c74f 100644 --- a/src/components/Common/Settings/CurrentChatModelSettings.tsx +++ b/src/components/Common/Settings/CurrentChatModelSettings.tsx @@ -1,16 +1,29 @@ import { getAllModelSettings } from "@/services/model-settings" import { useStoreChatModelSettings } from "@/store/model" import { useQuery } from "@tanstack/react-query" -import { Collapse, Form, Input, InputNumber, Modal, Skeleton } from "antd" +import { + Collapse, + Drawer, + Form, + Input, + InputNumber, + Modal, + Skeleton +} from "antd" import React from "react" import { useTranslation } from "react-i18next" type Props = { open: boolean setOpen: (open: boolean) => void + useDrawer?: boolean } -export const CurrentChatModelSettings = ({ open, setOpen }: Props) => { +export const CurrentChatModelSettings = ({ + open, + setOpen, + useDrawer +}: Props) => { const { t } = useTranslation("common") const [form] = Form.useForm() const cUserSettings = useStoreChatModelSettings() @@ -26,12 +39,151 @@ export const CurrentChatModelSettings = ({ open, setOpen }: Props) => { numCtx: cUserSettings.numCtx ?? data.numCtx, seed: cUserSettings.seed, numGpu: cUserSettings.numGpu ?? data.numGpu, + systemPrompt: cUserSettings.systemPrompt ?? "" }) return data }, enabled: open, refetchOnMount: true }) + + const renderBody = () => { + return ( + <> + {!isLoading ? ( +
{ + Object.entries(values).forEach(([key, value]) => { + cUserSettings.setX(key, value) + setOpen(false) + }) + }} + form={form} + layout="vertical"> + {useDrawer && ( + <> + + + + + )} + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) + } + ]} + /> + + + + ) : ( + + )} + + ) + } + + if (useDrawer) { + return ( + setOpen(false)} + width={500} + title={t("currentChatModelSettings")}> + {renderBody()} + + ) + } + return ( { onOk={() => setOpen(false)} onCancel={() => setOpen(false)} footer={null}> - {!isLoading ? ( -
{ - Object.entries(values).forEach(([key, value]) => { - cUserSettings.setX(key, value) - setOpen(false) - }) - }} - form={form} - layout="vertical"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - ) - } - ]} - /> - - - - ) : ( - - )} + {renderBody()}
) } diff --git a/src/components/Layouts/Layout.tsx b/src/components/Layouts/Layout.tsx index 93a41ba..c279a4b 100644 --- a/src/components/Layouts/Layout.tsx +++ b/src/components/Layouts/Layout.tsx @@ -76,6 +76,7 @@ export default function OptionLayout({ ) diff --git a/src/hooks/useMessageOption.tsx b/src/hooks/useMessageOption.tsx index 4e633f8..df3cdd8 100644 --- a/src/hooks/useMessageOption.tsx +++ b/src/hooks/useMessageOption.tsx @@ -68,7 +68,7 @@ export const useMessageOption = () => { } = useStoreMessageOption() const currentChatModelSettings = useStoreChatModelSettings() const [selectedModel, setSelectedModel] = useStorage("selectedModel") - const [ speechToTextLanguage, setSpeechToTextLanguage ] = useStorage( + const [speechToTextLanguage, setSpeechToTextLanguage] = useStorage( "speechToTextLanguage", "en-US" ) @@ -450,7 +450,11 @@ export const useMessageOption = () => { ) } - if (selectedPrompt) { + const isTempSystemprompt = + currentChatModelSettings.systemPrompt && + currentChatModelSettings.systemPrompt?.trim().length > 0 + + if (!isTempSystemprompt && selectedPrompt) { applicationChatHistory.unshift( new SystemMessage({ content: [ @@ -463,6 +467,19 @@ export const useMessageOption = () => { ) } + if (isTempSystemprompt) { + applicationChatHistory.unshift( + new SystemMessage({ + content: [ + { + text: currentChatModelSettings.systemPrompt, + type: "text" + } + ] + }) + ) + } + const chunks = await ollama.stream( [...applicationChatHistory, humanMessage], { diff --git a/src/store/model.tsx b/src/store/model.tsx index 8fadca8..5514b24 100644 --- a/src/store/model.tsx +++ b/src/store/model.tsx @@ -63,6 +63,8 @@ type CurrentChatModelSettings = { setX: (key: string, value: any) => void reset: () => void + systemPrompt?: string + setSystemPrompt: (systemPrompt: string) => void } export const useStoreChatModelSettings = create( @@ -100,6 +102,8 @@ export const useStoreChatModelSettings = create( setVocabOnly: (vocabOnly: boolean) => set({ vocabOnly }), seetSeed: (seed: number) => set({ seed }), setX: (key: string, value: any) => set({ [key]: value }), + systemPrompt: undefined, + setSystemPrompt: (systemPrompt: string) => set({ systemPrompt }), reset: () => set({ f16KV: undefined, @@ -130,7 +134,8 @@ export const useStoreChatModelSettings = create( useMLock: undefined, useMMap: undefined, vocabOnly: undefined, - seed: undefined + seed: undefined, + systemPrompt: undefined }) }) )