From 3a05008ceae2a6d1872d610aca14ba7ebdb8cacc Mon Sep 17 00:00:00 2001 From: n4ze3m Date: Sat, 17 Aug 2024 13:55:47 +0530 Subject: [PATCH 1/6] chore: Update wxt npm dependency to version 0.19.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 44daa54..43057df 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "tailwindcss": "^3.4.1", "typescript": "5.3.3", "vite-plugin-top-level-await": "^1.4.1", - "wxt": "^0.17.7" + "wxt": "^0.19.6" }, "resolutions": { "@langchain/core": "0.1.45" From d5a01368371dd265354056266a671157ec1e0e03 Mon Sep 17 00:00:00 2001 From: n4ze3m Date: Sat, 17 Aug 2024 13:55:54 +0530 Subject: [PATCH 2/6] chore: Update wxt npm dependency to version 0.19.6 --- bun.lockb | Bin 417010 -> 439218 bytes src/entries/options/index.html | 1 + wxt.config.ts | 2 +- 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/bun.lockb b/bun.lockb index c2f8f9b5dc2090b7c823f60f56915e4a53436647..0669364a49f774ce0ce6b261463eff54484abbb0 100644 GIT binary patch delta 47760 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Ⓢ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%0Dv%c3jwCgZH6*R`&Gbs=MM%Ha{O^8OvnKqfeJ)x{ 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 A-v9sr diff --git a/src/entries/options/index.html b/src/entries/options/index.html index 05423c3..c30dfad 100644 --- a/src/entries/options/index.html +++ b/src/entries/options/index.html @@ -4,6 +4,7 @@ Page Assist - A Web UI for Local AI Models + diff --git a/wxt.config.ts b/wxt.config.ts index 10b2eff..1e1bb1a 100644 --- a/wxt.config.ts +++ b/wxt.config.ts @@ -50,7 +50,7 @@ export default defineConfig({ outDir: "build", manifest: { - version: "1.2.0", + version: "1.2.1", name: process.env.TARGET === "firefox" ? "Page Assist - A Web UI for Local AI Models" From 00735cddadf743d29f8fbed21f7de75cee439fe2 Mon Sep 17 00:00:00 2001 From: n4ze3m Date: Tue, 20 Aug 2024 15:36:59 +0530 Subject: [PATCH 3/6] feat: Update context menu options with localized titles --- src/entries/background.ts | 10 +++++----- src/public/_locales/en/messages.json | 15 +++++++++++++++ src/public/_locales/es/messages.json | 20 +++++++++++++++++++- src/public/_locales/fa/messages.json | 15 +++++++++++++++ src/public/_locales/fr/messages.json | 15 +++++++++++++++ src/public/_locales/it/messages.json | 15 +++++++++++++++ src/public/_locales/ja/messages.json | 17 ++++++++++++++++- src/public/_locales/ml/messages.json | 15 +++++++++++++++ src/public/_locales/ru/messages.json | 15 +++++++++++++++ src/public/_locales/zh_CN/messages.json | 15 +++++++++++++++ wxt.config.ts | 4 ++-- 11 files changed, 147 insertions(+), 9 deletions(-) diff --git a/src/entries/background.ts b/src/entries/background.ts index 1f0de4b..9a9bcd5 100644 --- a/src/entries/background.ts +++ b/src/entries/background.ts @@ -64,31 +64,31 @@ export default defineBackground({ browser.contextMenus.create({ id: "summarize-pa", - title: "Summarize", + title: browser.i18n.getMessage("contextSummarize"), contexts: ["selection"] }) browser.contextMenus.create({ id: "explain-pa", - title: "Explain", + title: browser.i18n.getMessage("contextExplain"), contexts: ["selection"] }) browser.contextMenus.create({ id: "rephrase-pa", - title: "Rephrase", + title: browser.i18n.getMessage("contextRephrase"), contexts: ["selection"] }) browser.contextMenus.create({ id: "translate-pg", - title: "Translate", + title: browser.i18n.getMessage("contextTranslate"), contexts: ["selection"] }) browser.contextMenus.create({ id: "custom-pg", - title: "Custom", + title: browser.i18n.getMessage("contextCustom"), contexts: ["selection"] }) diff --git a/src/public/_locales/en/messages.json b/src/public/_locales/en/messages.json index a574d20..cd34708 100644 --- a/src/public/_locales/en/messages.json +++ b/src/public/_locales/en/messages.json @@ -10,5 +10,20 @@ }, "openOptionToChat": { "message": "Open Web UI to Chat" + }, + "contextSummarize": { + "message": "Summarize" + }, + "contextExplain": { + "message": "Explain" + }, + "contextRephrase": { + "message": "Rephrase" + }, + "contextTranslate" :{ + "message": "Translate" + }, + "contextCustom": { + "message": "Custom" } } \ No newline at end of file diff --git a/src/public/_locales/es/messages.json b/src/public/_locales/es/messages.json index a7272c7..af086ab 100644 --- a/src/public/_locales/es/messages.json +++ b/src/public/_locales/es/messages.json @@ -7,5 +7,23 @@ }, "openSidePanelToChat": { "message": "Abrir Copilot para Chatear" + }, + "openOptionToChat": { + "message": "Abrir Web UI para Chatear" + }, + "contextSummarize": { + "message": "Resumir" + }, + "contextExplain": { + "message": "Explicar" + }, + "contextRephrase": { + "message": "Reformular" + }, + "contextTranslate": { + "message": "Traducir" + }, + "contextCustom": { + "message": "Personalizado" } -} +} \ No newline at end of file diff --git a/src/public/_locales/fa/messages.json b/src/public/_locales/fa/messages.json index 2d047ed..c193a32 100644 --- a/src/public/_locales/fa/messages.json +++ b/src/public/_locales/fa/messages.json @@ -10,5 +10,20 @@ }, "openOptionToChat": { "message": "باز کردن رابط کاربری وب برای گفتگو" + }, + "contextSummarize": { + "message": "خلاصه کردن" + }, + "contextExplain": { + "message": "توضیح دادن" + }, + "contextRephrase": { + "message": "بازنویسی" + }, + "contextTranslate" :{ + "message": "ترجمه کردن" + }, + "contextCustom": { + "message": "سفارشی" } } diff --git a/src/public/_locales/fr/messages.json b/src/public/_locales/fr/messages.json index 6b53932..179752d 100644 --- a/src/public/_locales/fr/messages.json +++ b/src/public/_locales/fr/messages.json @@ -7,5 +7,20 @@ }, "openSidePanelToChat": { "message": "Ouvrir Copilot pour discuter" + }, + "contextSummarize": { + "message": "Résumer" + }, + "contextExplain": { + "message": "Expliquer" + }, + "contextRephrase": { + "message": "Reformuler" + }, + "contextTranslate" :{ + "message": "Traduire" + }, + "contextCustom": { + "message": "Personnalisé" } } \ No newline at end of file diff --git a/src/public/_locales/it/messages.json b/src/public/_locales/it/messages.json index eb773d3..eaee088 100644 --- a/src/public/_locales/it/messages.json +++ b/src/public/_locales/it/messages.json @@ -7,5 +7,20 @@ }, "openSidePanelToChat": { "message": "Apri Copilot per chattare" + }, + "contextSummarize": { + "message": "Riassumi" + }, + "contextExplain": { + "message": "Spiega" + }, + "contextRephrase": { + "message": "Riformula" + }, + "contextTranslate" :{ + "message": "Traduci" + }, + "contextCustom": { + "message": "Personalizzato" } } diff --git a/src/public/_locales/ja/messages.json b/src/public/_locales/ja/messages.json index ced8c60..347ad7b 100644 --- a/src/public/_locales/ja/messages.json +++ b/src/public/_locales/ja/messages.json @@ -7,5 +7,20 @@ }, "openSidePanelToChat": { "message": "チャットするためにCopilotを開く" - } + }, + "contextSummarize": { + "message": "要約" + }, + "contextExplain": { + "message": "説明" + }, + "contextRephrase": { + "message": "言い換え" + }, + "contextTranslate" :{ + "message": "翻訳" + }, + "contextCustom": { + "message": "カスタム" + } } \ No newline at end of file diff --git a/src/public/_locales/ml/messages.json b/src/public/_locales/ml/messages.json index ad09cde..4a6699a 100644 --- a/src/public/_locales/ml/messages.json +++ b/src/public/_locales/ml/messages.json @@ -7,5 +7,20 @@ }, "openSidePanelToChat": { "message": "ചാറ്റ് ചെയ്യാന്‍ സൈഡ് പാനല്‍ തുറക്കുക" + }, + "contextSummarize": { + "message": "സംഗ്രഹിക്കുക" + }, + "contextExplain": { + "message": "വിശദീകരിക്കുക" + }, + "contextRephrase": { + "message": "പുനഃരൂപീകരിക്കുക" + }, + "contextTranslate" :{ + "message": "വിവർത്തനം ചെയ്യുക" + }, + "contextCustom": { + "message": "ഇഷ്ടാനുസൃതം" } } \ No newline at end of file diff --git a/src/public/_locales/ru/messages.json b/src/public/_locales/ru/messages.json index 94b1dfa..61c6a1d 100644 --- a/src/public/_locales/ru/messages.json +++ b/src/public/_locales/ru/messages.json @@ -7,5 +7,20 @@ }, "openSidePanelToChat": { "message": "Открыть Copilot для чата" + }, + "contextSummarize": { + "message": "Обобщить" + }, + "contextExplain": { + "message": "Объяснить" + }, + "contextRephrase": { + "message": "Перефразировать" + }, + "contextTranslate" :{ + "message": "Перевести" + }, + "contextCustom": { + "message": "Пользовательский" } } \ No newline at end of file diff --git a/src/public/_locales/zh_CN/messages.json b/src/public/_locales/zh_CN/messages.json index 49dadd1..e9be275 100644 --- a/src/public/_locales/zh_CN/messages.json +++ b/src/public/_locales/zh_CN/messages.json @@ -7,5 +7,20 @@ }, "openSidePanelToChat": { "message": "打开Copilot进行聊天" + }, + "contextSummarize": { + "message": "总结" + }, + "contextExplain": { + "message": "解释" + }, + "contextRephrase": { + "message": "改述" + }, + "contextTranslate" :{ + "message": "翻译" + }, + "contextCustom": { + "message": "自定义" } } \ No newline at end of file diff --git a/wxt.config.ts b/wxt.config.ts index 1e1bb1a..c323981 100644 --- a/wxt.config.ts +++ b/wxt.config.ts @@ -37,7 +37,7 @@ export default defineConfig({ topLevelAwait({ promiseExportName: "__tla", promiseImportName: (i) => `__tla_${i}` - }) + }) as any ], build: { rollupOptions: { @@ -90,4 +90,4 @@ export default defineConfig({ ? firefoxMV2Permissions : chromeMV3Permissions } -}) +}) as any \ No newline at end of file From 4ef17ff479d50bf123275f392e78b7fe4f97f999 Mon Sep 17 00:00:00 2001 From: n4ze3m Date: Tue, 20 Aug 2024 16:11:50 +0530 Subject: [PATCH 4/6] feat: support for GPU layer --- src/assets/locale/en/common.json | 4 +++ src/assets/locale/es/common.json | 4 +++ src/assets/locale/fa/common.json | 6 ++++- src/assets/locale/fr/common.json | 4 +++ src/assets/locale/it/common.json | 5 +++- src/assets/locale/ja-JP/common.json | 4 +++ src/assets/locale/ml/common.json | 4 +++ src/assets/locale/pt-BR/common.json | 4 +++ src/assets/locale/ru/common.json | 5 +++- src/assets/locale/zh/common.json | 4 +++ .../Settings/CurrentChatModelSettings.tsx | 13 +++++++++- .../Option/Settings/model-settings.tsx | 21 +++++++++++---- src/hooks/useMessage.tsx | 26 +++++++++++++------ src/hooks/useMessageOption.tsx | 20 ++++++++++---- src/models/ChatOllama.ts | 2 +- src/models/index.ts | 7 +++-- 16 files changed, 108 insertions(+), 25 deletions(-) diff --git a/src/assets/locale/en/common.json b/src/assets/locale/en/common.json index 05ef169..47bcd67 100644 --- a/src/assets/locale/en/common.json +++ b/src/assets/locale/en/common.json @@ -81,6 +81,10 @@ "topP": { "label": "Top P", "placeholder": "Enter Top P value (e.g. 0.9, 0.95)" + }, + "numGpu": { + "label": "Num GPU", + "placeholder": "Enter number of layers to send to GPU(s)" } }, "advanced": "More Model Settings" diff --git a/src/assets/locale/es/common.json b/src/assets/locale/es/common.json index 06d0a00..9f1950c 100644 --- a/src/assets/locale/es/common.json +++ b/src/assets/locale/es/common.json @@ -81,6 +81,10 @@ "topP": { "label": "Top P", "placeholder": "Ingresar el valor de Top P (ej: 0.9, 0.95)" + }, + "numGpu": { + "label": "Num GPU", + "placeholder": "Ingrese el número de capas para enviar a la(s) GPU(s)" } }, "advanced": "Más Configuraciones del Modelo" diff --git a/src/assets/locale/fa/common.json b/src/assets/locale/fa/common.json index 3c02c21..3e9635b 100644 --- a/src/assets/locale/fa/common.json +++ b/src/assets/locale/fa/common.json @@ -81,8 +81,12 @@ "topP": { "label": "Top P", "placeholder": "مقدار Top P را وارد کنید (مثلا 0.9, 0.95)" + }, + "numGpu": { + "label": "Num GPU", + "placeholder": "تعداد لایه‌هایی که به GPU(ها) ارسال می‌شود را وارد کنید" } }, "advanced": "تنظیمات بیشتر مدل" } -} +} \ No newline at end of file diff --git a/src/assets/locale/fr/common.json b/src/assets/locale/fr/common.json index cf601db..4833892 100644 --- a/src/assets/locale/fr/common.json +++ b/src/assets/locale/fr/common.json @@ -81,6 +81,10 @@ "topP": { "label": "Top P", "placeholder": "Entrez la valeur Top P (par exemple 0,9, 0,95)" + }, + "numGpu": { + "label": "Num GPU", + "placeholder": "Entrez le nombre de couches à envoyer au(x) GPU(s)" } }, "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 0b0708e..e56b203 100644 --- a/src/assets/locale/it/common.json +++ b/src/assets/locale/it/common.json @@ -81,7 +81,10 @@ "topP": { "label": "Top P", "placeholder": "Inserisci il Valore Top P (e.g. 0.9, 0.95)" - } + }, + "numGpu": { + "label": "Num GPU", + "placeholder": "Inserisci il numero di layer da inviare alla/e GPU" } }, "advanced": "Altre Impostazioni del Modello" }, diff --git a/src/assets/locale/ja-JP/common.json b/src/assets/locale/ja-JP/common.json index 4fcde04..d65ca6d 100644 --- a/src/assets/locale/ja-JP/common.json +++ b/src/assets/locale/ja-JP/common.json @@ -81,6 +81,10 @@ "topP": { "label": "Top P", "placeholder": "Top P値を入力してください(例:0.9、0.95)" + }, + "numGpu": { + "label": "Num GPU", + "placeholder": "GPU(s)に送信するレイヤー数を入力してください" } }, "advanced": "その他のモデル設定" diff --git a/src/assets/locale/ml/common.json b/src/assets/locale/ml/common.json index 4d923c0..5f03cbc 100644 --- a/src/assets/locale/ml/common.json +++ b/src/assets/locale/ml/common.json @@ -80,6 +80,10 @@ "topP": { "label": "ടോപ് P", "placeholder": "ടോപ് P മൂല്യം നൽകുക (ഉദാ: 0.9, 0.95)" + }, + "numGpu": { + "label": "ജിപിയു എണ്ണം", + "placeholder": "ജിപിയു(കൾ)ക്ക് അയക്കേണ്ട ലേയറുകളുടെ എണ്ണം നൽകുക" } }, "advanced": "കൂടുതൽ മോഡൽ ക്രമീകരണങ്ങൾ" diff --git a/src/assets/locale/pt-BR/common.json b/src/assets/locale/pt-BR/common.json index a322b7c..f9b3609 100644 --- a/src/assets/locale/pt-BR/common.json +++ b/src/assets/locale/pt-BR/common.json @@ -81,6 +81,10 @@ "topP": { "label": "Top P", "placeholder": "Digite o valor do Top P (ex: 0.9, 0.95)" + }, + "numGpu": { + "label": "Num GPUs", + "placeholder": "Digite o número de camadas para enviar para a(s) GPU(s)" } }, "advanced": "Mais Configurações do Modelo" diff --git a/src/assets/locale/ru/common.json b/src/assets/locale/ru/common.json index b14c855..a4262fa 100644 --- a/src/assets/locale/ru/common.json +++ b/src/assets/locale/ru/common.json @@ -81,7 +81,10 @@ "topP": { "label": "Top P", "placeholder": "Введите значение Top P (например, 0.9, 0.95)" - } + }, + "numGpu": { + "label": "Num GPU", + "placeholder": "Введите количество слоев для отправки на GPU" } }, "advanced": "Больше настроек модели" }, diff --git a/src/assets/locale/zh/common.json b/src/assets/locale/zh/common.json index 9145e48..badcec4 100644 --- a/src/assets/locale/zh/common.json +++ b/src/assets/locale/zh/common.json @@ -81,6 +81,10 @@ "topP": { "label": "Top P", "placeholder": "输入Top P值(例如:0.9、0.95)" + }, + "numGpu": { + "label": "Num GPU", + "placeholder": "输入要发送到 GPU 的层数" } }, "advanced": "更多模型设置" diff --git a/src/components/Common/Settings/CurrentChatModelSettings.tsx b/src/components/Common/Settings/CurrentChatModelSettings.tsx index b1d1c07..147b232 100644 --- a/src/components/Common/Settings/CurrentChatModelSettings.tsx +++ b/src/components/Common/Settings/CurrentChatModelSettings.tsx @@ -24,7 +24,8 @@ export const CurrentChatModelSettings = ({ open, setOpen }: Props) => { topP: cUserSettings.topP ?? data.topP, keepAlive: cUserSettings.keepAlive ?? data.keepAlive, numCtx: cUserSettings.numCtx ?? data.numCtx, - seed: cUserSettings.seed + seed: cUserSettings.seed, + numGpu: cUserSettings.numGpu ?? data.numGpu, }) return data }, @@ -118,6 +119,16 @@ export const CurrentChatModelSettings = ({ open, setOpen }: Props) => { placeholder={t("modelSettings.form.topP.placeholder")} /> + + + + ) } diff --git a/src/components/Option/Settings/model-settings.tsx b/src/components/Option/Settings/model-settings.tsx index b7a5b71..b91dda5 100644 --- a/src/components/Option/Settings/model-settings.tsx +++ b/src/components/Option/Settings/model-settings.tsx @@ -6,7 +6,6 @@ import { Form, Skeleton, Input, InputNumber, Collapse } from "antd" import React from "react" import { useTranslation } from "react-i18next" - export const ModelSettings = () => { const { t } = useTranslation("common") const [form] = Form.useForm() @@ -24,10 +23,10 @@ export const ModelSettings = () => {
- -

- {t("modelSettings.label")} -

+ +

+ {t("modelSettings.label")} +

{t("modelSettings.description")} @@ -41,6 +40,7 @@ export const ModelSettings = () => { temperature: number topK: number topP: number + numGpu: number }) => { Object.entries(values).forEach(([key, value]) => { setModelSetting(key, value) @@ -106,6 +106,17 @@ export const ModelSettings = () => { placeholder={t("modelSettings.form.topP.placeholder")} /> + + + ) } diff --git a/src/hooks/useMessage.tsx b/src/hooks/useMessage.tsx index 3d61528..abf9a6b 100644 --- a/src/hooks/useMessage.tsx +++ b/src/hooks/useMessage.tsx @@ -122,7 +122,9 @@ export const useMessage = () => { topP: currentChatModelSettings?.topP ?? userDefaultModelSettings?.topP, numCtx: currentChatModelSettings?.numCtx ?? userDefaultModelSettings?.numCtx, - seed: currentChatModelSettings?.seed + seed: currentChatModelSettings?.seed, + numGpu: + currentChatModelSettings?.numGpu ?? userDefaultModelSettings?.numGpu }) let newMessage: Message[] = [] @@ -248,7 +250,9 @@ export const useMessage = () => { numCtx: currentChatModelSettings?.numCtx ?? userDefaultModelSettings?.numCtx, - seed: currentChatModelSettings?.seed + seed: currentChatModelSettings?.seed, + numGpu: + currentChatModelSettings?.numGpu ?? userDefaultModelSettings?.numGpu }) const response = await questionOllama.invoke(promptForQuestion) query = response.content.toString() @@ -442,7 +446,9 @@ export const useMessage = () => { topP: currentChatModelSettings?.topP ?? userDefaultModelSettings?.topP, numCtx: currentChatModelSettings?.numCtx ?? userDefaultModelSettings?.numCtx, - seed: currentChatModelSettings?.seed + seed: currentChatModelSettings?.seed, + numGpu: + currentChatModelSettings?.numGpu ?? userDefaultModelSettings?.numGpu }) let newMessage: Message[] = [] @@ -645,7 +651,9 @@ export const useMessage = () => { topP: currentChatModelSettings?.topP ?? userDefaultModelSettings?.topP, numCtx: currentChatModelSettings?.numCtx ?? userDefaultModelSettings?.numCtx, - seed: currentChatModelSettings?.seed + seed: currentChatModelSettings?.seed, + numGpu: + currentChatModelSettings?.numGpu ?? userDefaultModelSettings?.numGpu }) let newMessage: Message[] = [] @@ -718,7 +726,9 @@ export const useMessage = () => { numCtx: currentChatModelSettings?.numCtx ?? userDefaultModelSettings?.numCtx, - seed: currentChatModelSettings?.seed + seed: currentChatModelSettings?.seed, + numGpu: + currentChatModelSettings?.numGpu ?? userDefaultModelSettings?.numGpu }) const response = await questionOllama.invoke(promptForQuestion) query = response.content.toString() @@ -890,7 +900,9 @@ export const useMessage = () => { topP: currentChatModelSettings?.topP ?? userDefaultModelSettings?.topP, numCtx: currentChatModelSettings?.numCtx ?? userDefaultModelSettings?.numCtx, - seed: currentChatModelSettings?.seed + seed: currentChatModelSettings?.seed, + numGpu: + currentChatModelSettings?.numGpu ?? userDefaultModelSettings?.numGpu }) let newMessage: Message[] = [] @@ -932,8 +944,6 @@ export const useMessage = () => { let contentToSave = "" try { - - const prompt = await getPrompt(messageType) let humanMessage = new HumanMessage({ content: [ diff --git a/src/hooks/useMessageOption.tsx b/src/hooks/useMessageOption.tsx index 2b28aa7..a362f69 100644 --- a/src/hooks/useMessageOption.tsx +++ b/src/hooks/useMessageOption.tsx @@ -117,7 +117,9 @@ export const useMessageOption = () => { topP: currentChatModelSettings?.topP ?? userDefaultModelSettings?.topP, numCtx: currentChatModelSettings?.numCtx ?? userDefaultModelSettings?.numCtx, - seed: currentChatModelSettings?.seed + seed: currentChatModelSettings?.seed, + numGpu: + currentChatModelSettings?.numGpu ?? userDefaultModelSettings?.numGpu }) let newMessage: Message[] = [] @@ -190,7 +192,9 @@ export const useMessageOption = () => { numCtx: currentChatModelSettings?.numCtx ?? userDefaultModelSettings?.numCtx, - seed: currentChatModelSettings?.seed + seed: currentChatModelSettings?.seed, + numGpu: + currentChatModelSettings?.numGpu ?? userDefaultModelSettings?.numGpu }) const response = await questionOllama.invoke(promptForQuestion) query = response.content.toString() @@ -360,7 +364,9 @@ export const useMessageOption = () => { topP: currentChatModelSettings?.topP ?? userDefaultModelSettings?.topP, numCtx: currentChatModelSettings?.numCtx ?? userDefaultModelSettings?.numCtx, - seed: currentChatModelSettings?.seed + seed: currentChatModelSettings?.seed, + numGpu: + currentChatModelSettings?.numGpu ?? userDefaultModelSettings?.numGpu }) let newMessage: Message[] = [] @@ -576,7 +582,9 @@ export const useMessageOption = () => { topP: currentChatModelSettings?.topP ?? userDefaultModelSettings?.topP, numCtx: currentChatModelSettings?.numCtx ?? userDefaultModelSettings?.numCtx, - seed: currentChatModelSettings?.seed + seed: currentChatModelSettings?.seed, + numGpu: + currentChatModelSettings?.numGpu ?? userDefaultModelSettings?.numGpu }) let newMessage: Message[] = [] @@ -665,7 +673,9 @@ export const useMessageOption = () => { numCtx: currentChatModelSettings?.numCtx ?? userDefaultModelSettings?.numCtx, - seed: currentChatModelSettings?.seed + seed: currentChatModelSettings?.seed, + numGpu: + currentChatModelSettings?.numGpu ?? userDefaultModelSettings?.numGpu }) const response = await questionOllama.invoke(promptForQuestion) query = response.content.toString() diff --git a/src/models/ChatOllama.ts b/src/models/ChatOllama.ts index 2a4c28b..1bc7ddb 100644 --- a/src/models/ChatOllama.ts +++ b/src/models/ChatOllama.ts @@ -126,7 +126,7 @@ export class ChatOllama this.mirostatTau = fields.mirostatTau; this.numBatch = fields.numBatch; this.numCtx = fields.numCtx; - this.numGpu = fields.numGpu; + this.numGpu = fields.numGpu === null ? undefined : fields.numGpu; this.numGqa = fields.numGqa; this.numKeep = fields.numKeep; this.numPredict = fields.numPredict; diff --git a/src/models/index.ts b/src/models/index.ts index 4048cb3..ce3ab39 100644 --- a/src/models/index.ts +++ b/src/models/index.ts @@ -9,7 +9,8 @@ export const pageAssistModel = async ({ topK, topP, numCtx, - seed + seed, + numGpu }: { model: string baseUrl: string @@ -19,6 +20,7 @@ export const pageAssistModel = async ({ topP?: number numCtx?: number seed?: number + numGpu?: number }) => { switch (model) { case "chrome::gemini-nano::page-assist": @@ -35,7 +37,8 @@ export const pageAssistModel = async ({ topP, numCtx, seed, - model + model, + numGpu }) } } From 564b137e662483d6c59ae47542bf7adde6124a3f Mon Sep 17 00:00:00 2001 From: n4ze3m Date: Tue, 20 Aug 2024 18:07:22 +0530 Subject: [PATCH 5/6] chore: Update default file upload limit labels and placeholders for multiple locales --- src/assets/locale/en/settings.json | 6 +++--- src/assets/locale/es/settings.json | 7 +++---- src/assets/locale/fa/settings.json | 7 +++---- src/assets/locale/fr/settings.json | 7 +++---- src/assets/locale/it/settings.json | 7 +++---- src/assets/locale/ja-JP/settings.json | 6 +++--- src/assets/locale/ml/settings.json | 6 +++--- src/assets/locale/pt-BR/settings.json | 6 +++--- src/assets/locale/ru/settings.json | 7 +++---- src/assets/locale/zh/settings.json | 6 +++--- 10 files changed, 30 insertions(+), 35 deletions(-) diff --git a/src/assets/locale/en/settings.json b/src/assets/locale/en/settings.json index fa16a1a..1ebf81d 100644 --- a/src/assets/locale/en/settings.json +++ b/src/assets/locale/en/settings.json @@ -308,9 +308,9 @@ "required": "Please enter a chunk overlap" }, "totalFilePerKB": { - "label": "Knowledge Base Default File Limit", - "placeholder": "Enter default file limit (e.g., 10)", - "required": "Please enter the default file limit" + "label": "Knowledge Base Default File Upload Limit", + "placeholder": "Enter default file upload limit (e.g., 10)", + "required": "Please enter the default file upload limit" } }, "prompt": { diff --git a/src/assets/locale/es/settings.json b/src/assets/locale/es/settings.json index bd0d2ad..4a918d5 100644 --- a/src/assets/locale/es/settings.json +++ b/src/assets/locale/es/settings.json @@ -308,10 +308,9 @@ "required": "Por favor, ingresar el solapamiento del chunk" }, "totalFilePerKB": { - "label": "Límite predeterminado de archivos de la base de conocimientos", - "placeholder": "Ingrese el límite predeterminado de archivos (ej. 10)", - "required": "Por favor, ingrese el límite predeterminado de archivos" - } + "label": "Límite predeterminado de carga de archivos para la Base de Conocimientos", + "placeholder": "Ingrese el límite predeterminado de carga de archivos (ej., 10)", + "required": "Por favor, ingrese el límite predeterminado de carga de archivos" } }, "prompt": { "label": "Configurar el Prompt del RAG", diff --git a/src/assets/locale/fa/settings.json b/src/assets/locale/fa/settings.json index f1d2d13..c1e3211 100644 --- a/src/assets/locale/fa/settings.json +++ b/src/assets/locale/fa/settings.json @@ -307,10 +307,9 @@ "required": "لطفا یک همپوشانی تکه ای وارد کنید" }, "totalFilePerKB": { - "label": "محدودیت فایل پیش فرض پایگاه دانش", - "placeholder": "محدودیت فایل پیش فرض را وارد کنید (به عنوان مثال، 10)", - "required": "لطفا محدودیت پیش فرض فایل را وارد کنید" - } + "label": "محدودیت پیش‌فرض آپلود فایل پایگاه دانش", + "placeholder": "محدودیت پیش‌فرض آپلود فایل را وارد کنید (مثلاً 10)", + "required": "لطفاً محدودیت پیش‌فرض آپلود فایل را وارد کنید" } }, "prompt": { "label": "پیکربندی پرامپت RAG", diff --git a/src/assets/locale/fr/settings.json b/src/assets/locale/fr/settings.json index 3310afd..680665a 100644 --- a/src/assets/locale/fr/settings.json +++ b/src/assets/locale/fr/settings.json @@ -308,10 +308,9 @@ "required": "Veuillez saisir un chevauchement" }, "totalFilePerKB": { - "label": "Limite par défaut de fichiers de la base de connaissances", - "placeholder": "Entrez la limite par défaut de fichiers (ex. 10)", - "required": "Veuillez entrer la limite par défaut de fichiers" - } + "label": "Limite par défaut de téléchargement de fichiers pour la base de connaissances", + "placeholder": "Entrez la limite par défaut de téléchargement de fichiers (par exemple, 10)", + "required": "Veuillez saisir la limite par défaut de téléchargement de fichiers" } }, "prompt": { "label": "Configure RAG Prompt", diff --git a/src/assets/locale/it/settings.json b/src/assets/locale/it/settings.json index ba6ce98..2d2716b 100644 --- a/src/assets/locale/it/settings.json +++ b/src/assets/locale/it/settings.json @@ -308,10 +308,9 @@ "required": "Inserisci la Sovrapposizione del Blocco" }, "totalFilePerKB": { - "label": "Limite predefinito di file della base di conoscenza", - "placeholder": "Inserisci il limite predefinito di file (es. 10)", - "required": "Inserisci il limite predefinito di file" - } + "label": "Limite Predefinito di Caricamento File per la Base di Conoscenza", + "placeholder": "Inserisci il limite predefinito di caricamento file (es. 10)", + "required": "Inserisci il limite predefinito di caricamento file" } }, "prompt": { "label": "Configura il Prompt RAG", diff --git a/src/assets/locale/ja-JP/settings.json b/src/assets/locale/ja-JP/settings.json index 1180f4c..53bd4ad 100644 --- a/src/assets/locale/ja-JP/settings.json +++ b/src/assets/locale/ja-JP/settings.json @@ -311,9 +311,9 @@ "required": "チャンクオーバーラップを入力してください" }, "totalFilePerKB": { - "label": "ナレッジベースのデフォルトファイル制限", - "placeholder": "デフォルトのファイル制限を入力してください(例:10)", - "required": "デフォルトのファイル制限を入力してください" + "label": "知識ベースのデフォルトファイルアップロード制限", + "placeholder": "デフォルトのファイルアップロード制限を入力してください(例:10)", + "required": "デフォルトのファイルアップロード制限を入力してください" } }, "prompt": { diff --git a/src/assets/locale/ml/settings.json b/src/assets/locale/ml/settings.json index c151ff9..a6f7abf 100644 --- a/src/assets/locale/ml/settings.json +++ b/src/assets/locale/ml/settings.json @@ -311,9 +311,9 @@ "required": "ദയവായി ചങ്ക് ഓവര്‍ലാപ്പ് നല്കുക" }, "totalFilePerKB": { - "label": "Limite padrão de arquivos da base de conhecimento", - "placeholder": "Digite o limite padrão de arquivos (ex. 10)", - "required": "Por favor, digite o limite padrão de arquivos" + "label": "വിജ്ഞാനാധാരത്തിന്റെ സ്ഥിര ഫയൽ അപ്‌ലോഡ് പരിധി", + "placeholder": "സ്ഥിര ഫയൽ അപ്‌ലോഡ് പരിധി നൽകുക (ഉദാ: 10)", + "required": "ദയവായി സ്ഥിര ഫയൽ അപ്‌ലോഡ് പരിധി നൽകുക" } }, "prompt": { diff --git a/src/assets/locale/pt-BR/settings.json b/src/assets/locale/pt-BR/settings.json index 7840f31..2d16351 100644 --- a/src/assets/locale/pt-BR/settings.json +++ b/src/assets/locale/pt-BR/settings.json @@ -308,9 +308,9 @@ "required": "Por favor, insira uma sobreposição de pedaço" }, "totalFilePerKB": { - "label": "Limite padrão de arquivos da base de conhecimento", - "placeholder": "Digite o limite padrão de arquivos (ex. 10)", - "required": "Por favor, digite o limite padrão de arquivos" + "label": "Limite Padrão de Upload de Arquivos da Base de Conhecimento", + "placeholder": "Digite o limite padrão de upload de arquivos (ex: 10)", + "required": "Por favor, insira o limite padrão de upload de arquivos" } }, "prompt": { diff --git a/src/assets/locale/ru/settings.json b/src/assets/locale/ru/settings.json index 2a8f95b..2c6353b 100644 --- a/src/assets/locale/ru/settings.json +++ b/src/assets/locale/ru/settings.json @@ -310,10 +310,9 @@ "required": "Пожалуйста, введите перекрытие фрагментов" }, "totalFilePerKB": { - "label": "Стандартный лимит файлов базы знаний", - "placeholder": "Введите стандартный лимит файлов (напр. 10)", - "required": "Пожалуйста, введите стандартный лимит файлов" - } + "label": "Лимит загрузки файлов по умолчанию для базы знаний", + "placeholder": "Введите лимит загрузки файлов по умолчанию (например, 10)", + "required": "Пожалуйста, введите лимит загрузки файлов по умолчанию" } }, "prompt": { "label": "Настройка системной подсказки RAG", diff --git a/src/assets/locale/zh/settings.json b/src/assets/locale/zh/settings.json index 4716831..abc9150 100644 --- a/src/assets/locale/zh/settings.json +++ b/src/assets/locale/zh/settings.json @@ -313,9 +313,9 @@ "required": "请输入嵌入重叠" }, "totalFilePerKB": { - "label": "知识库默认文件限制", - "placeholder": "输入默认文件限制(例如:10)", - "required": "请输入默认文件限制" + "label": "知识库默认文件上传限制", + "placeholder": "输入默认文件上传限制(例如:10)", + "required": "请输入默认文件上传限制" } }, "prompt": { From 35b8579028eb595fe09837a0f6e67938bb4834fb Mon Sep 17 00:00:00 2001 From: n4ze3m Date: Tue, 20 Aug 2024 18:32:01 +0530 Subject: [PATCH 6/6] feat: Add Number of Retrieved Documents on RAG --- src/assets/locale/en/settings.json | 5 ++ src/assets/locale/es/settings.json | 10 +++- src/assets/locale/fa/settings.json | 10 +++- src/assets/locale/fr/settings.json | 12 +++-- src/assets/locale/it/settings.json | 14 ++++-- src/assets/locale/ja-JP/settings.json | 5 ++ src/assets/locale/ml/settings.json | 5 ++ src/assets/locale/pt-BR/settings.json | 5 ++ src/assets/locale/ru/settings.json | 8 +++- src/assets/locale/zh/settings.json | 5 ++ src/components/Option/Settings/rag.tsx | 64 ++++++++++++++++++++------ src/hooks/useMessageOption.tsx | 4 +- src/services/app.ts | 11 ++++- src/services/ollama.ts | 6 ++- 14 files changed, 133 insertions(+), 31 deletions(-) diff --git a/src/assets/locale/en/settings.json b/src/assets/locale/en/settings.json index 1ebf81d..eb54db8 100644 --- a/src/assets/locale/en/settings.json +++ b/src/assets/locale/en/settings.json @@ -311,6 +311,11 @@ "label": "Knowledge Base Default File Upload Limit", "placeholder": "Enter default file upload limit (e.g., 10)", "required": "Please enter the default file upload limit" + }, + "noOfRetrievedDocs": { + "label": "Number of Retrieved Documents", + "placeholder": "Enter Number of Retrieved Documents", + "required": "Please enter the number of retrieved documents" } }, "prompt": { diff --git a/src/assets/locale/es/settings.json b/src/assets/locale/es/settings.json index 4a918d5..241df94 100644 --- a/src/assets/locale/es/settings.json +++ b/src/assets/locale/es/settings.json @@ -30,7 +30,7 @@ "sendNotificationAfterIndexing": { "label": "Enviar notificación después de terminar el procesamiento de la base de conocimientos" }, - "generateTitle" :{ + "generateTitle": { "label": "Generar título usando IA" } }, @@ -310,7 +310,13 @@ "totalFilePerKB": { "label": "Límite predeterminado de carga de archivos para la Base de Conocimientos", "placeholder": "Ingrese el límite predeterminado de carga de archivos (ej., 10)", - "required": "Por favor, ingrese el límite predeterminado de carga de archivos" } + "required": "Por favor, ingrese el límite predeterminado de carga de archivos" + }, + "noOfRetrievedDocs": { + "label": "Número de Documentos Recuperados", + "placeholder": "Ingrese el Número de Documentos Recuperados", + "required": "Por favor, ingrese el número de documentos recuperados" + } }, "prompt": { "label": "Configurar el Prompt del RAG", diff --git a/src/assets/locale/fa/settings.json b/src/assets/locale/fa/settings.json index c1e3211..039f222 100644 --- a/src/assets/locale/fa/settings.json +++ b/src/assets/locale/fa/settings.json @@ -30,7 +30,7 @@ "sendNotificationAfterIndexing": { "label": "ارسال نوتیفیکیشن پس از اتمام پردازش پایگاه دانش" }, - "generateTitle" :{ + "generateTitle": { "label": "تولید عنوان با استفاده از هوش مصنوعی" } }, @@ -309,7 +309,13 @@ "totalFilePerKB": { "label": "محدودیت پیش‌فرض آپلود فایل پایگاه دانش", "placeholder": "محدودیت پیش‌فرض آپلود فایل را وارد کنید (مثلاً 10)", - "required": "لطفاً محدودیت پیش‌فرض آپلود فایل را وارد کنید" } + "required": "لطفاً محدودیت پیش‌فرض آپلود فایل را وارد کنید" + }, + "noOfRetrievedDocs": { + "label": "تعداد اسناد بازیابی شده", + "placeholder": "تعداد اسناد بازیابی شده را وارد کنید", + "required": "لطفاً تعداد اسناد بازیابی شده را وارد کنید" + } }, "prompt": { "label": "پیکربندی پرامپت RAG", diff --git a/src/assets/locale/fr/settings.json b/src/assets/locale/fr/settings.json index 680665a..027c1b3 100644 --- a/src/assets/locale/fr/settings.json +++ b/src/assets/locale/fr/settings.json @@ -29,8 +29,8 @@ }, "sendNotificationAfterIndexing": { "label": "Envoyer une notification après avoir terminé le traitement de la base de connaissances" - }, - "generateTitle" :{ + }, + "generateTitle": { "label": "Générer le titre en utilisant l'IA" } }, @@ -310,7 +310,13 @@ "totalFilePerKB": { "label": "Limite par défaut de téléchargement de fichiers pour la base de connaissances", "placeholder": "Entrez la limite par défaut de téléchargement de fichiers (par exemple, 10)", - "required": "Veuillez saisir la limite par défaut de téléchargement de fichiers" } + "required": "Veuillez saisir la limite par défaut de téléchargement de fichiers" + }, + "noOfRetrievedDocs": { + "label": "Nombre de documents récupérés", + "placeholder": "Entrez le nombre de documents récupérés", + "required": "Veuillez saisir le nombre de documents récupérés" + } }, "prompt": { "label": "Configure RAG Prompt", diff --git a/src/assets/locale/it/settings.json b/src/assets/locale/it/settings.json index 2d2716b..af15a71 100644 --- a/src/assets/locale/it/settings.json +++ b/src/assets/locale/it/settings.json @@ -29,8 +29,8 @@ }, "sendNotificationAfterIndexing": { "label": "Inviare notifica dopo aver terminato l'elaborazione della base di conoscenza" - }, - "generateTitle" :{ + }, + "generateTitle": { "label": "Genera titolo utilizzando l'IA" } }, @@ -308,9 +308,15 @@ "required": "Inserisci la Sovrapposizione del Blocco" }, "totalFilePerKB": { - "label": "Limite Predefinito di Caricamento File per la Base di Conoscenza", + "label": "Limite Predefinito di Caricamento File per la Base di Conoscenza", "placeholder": "Inserisci il limite predefinito di caricamento file (es. 10)", - "required": "Inserisci il limite predefinito di caricamento file" } + "required": "Inserisci il limite predefinito di caricamento file" + }, + "noOfRetrievedDocs": { + "label": "Numero di Documenti Recuperati", + "placeholder": "Inserisci il Numero di Documenti Recuperati", + "required": "Inserisci il numero di documenti recuperati" + } }, "prompt": { "label": "Configura il Prompt RAG", diff --git a/src/assets/locale/ja-JP/settings.json b/src/assets/locale/ja-JP/settings.json index 53bd4ad..af5a1f5 100644 --- a/src/assets/locale/ja-JP/settings.json +++ b/src/assets/locale/ja-JP/settings.json @@ -314,6 +314,11 @@ "label": "知識ベースのデフォルトファイルアップロード制限", "placeholder": "デフォルトのファイルアップロード制限を入力してください(例:10)", "required": "デフォルトのファイルアップロード制限を入力してください" + }, + "noOfRetrievedDocs": { + "label": "取得ドキュメント数", + "placeholder": "取得ドキュメント数を入力", + "required": "取得ドキュメント数を入力してください" } }, "prompt": { diff --git a/src/assets/locale/ml/settings.json b/src/assets/locale/ml/settings.json index a6f7abf..b6ebd30 100644 --- a/src/assets/locale/ml/settings.json +++ b/src/assets/locale/ml/settings.json @@ -314,6 +314,11 @@ "label": "വിജ്ഞാനാധാരത്തിന്റെ സ്ഥിര ഫയൽ അപ്‌ലോഡ് പരിധി", "placeholder": "സ്ഥിര ഫയൽ അപ്‌ലോഡ് പരിധി നൽകുക (ഉദാ: 10)", "required": "ദയവായി സ്ഥിര ഫയൽ അപ്‌ലോഡ് പരിധി നൽകുക" + }, + "noOfRetrievedDocs": { + "label": "വീണ്ടെടുത്ത രേഖകളുടെ എണ്ണം", + "placeholder": "വീണ്ടെടുത്ത രേഖകളുടെ എണ്ണം നൽകുക", + "required": "ദയവായി വീണ്ടെടുത്ത രേഖകളുടെ എണ്ണം നൽകുക" } }, "prompt": { diff --git a/src/assets/locale/pt-BR/settings.json b/src/assets/locale/pt-BR/settings.json index 2d16351..ac7e70b 100644 --- a/src/assets/locale/pt-BR/settings.json +++ b/src/assets/locale/pt-BR/settings.json @@ -311,6 +311,11 @@ "label": "Limite Padrão de Upload de Arquivos da Base de Conhecimento", "placeholder": "Digite o limite padrão de upload de arquivos (ex: 10)", "required": "Por favor, insira o limite padrão de upload de arquivos" + }, + "noOfRetrievedDocs": { + "label": "Número de Documentos Recuperados", + "placeholder": "Digite o Número de Documentos Recuperados", + "required": "Por favor, insira o número de documentos recuperados" } }, "prompt": { diff --git a/src/assets/locale/ru/settings.json b/src/assets/locale/ru/settings.json index 2c6353b..0c3c183 100644 --- a/src/assets/locale/ru/settings.json +++ b/src/assets/locale/ru/settings.json @@ -312,7 +312,13 @@ "totalFilePerKB": { "label": "Лимит загрузки файлов по умолчанию для базы знаний", "placeholder": "Введите лимит загрузки файлов по умолчанию (например, 10)", - "required": "Пожалуйста, введите лимит загрузки файлов по умолчанию" } + "required": "Пожалуйста, введите лимит загрузки файлов по умолчанию" + }, + "noOfRetrievedDocs": { + "label": "Количество извлеченных документов", + "placeholder": "Введите количество извлеченных документов", + "required": "Пожалуйста, введите количество извлеченных документов" + } }, "prompt": { "label": "Настройка системной подсказки RAG", diff --git a/src/assets/locale/zh/settings.json b/src/assets/locale/zh/settings.json index abc9150..4c86040 100644 --- a/src/assets/locale/zh/settings.json +++ b/src/assets/locale/zh/settings.json @@ -316,6 +316,11 @@ "label": "知识库默认文件上传限制", "placeholder": "输入默认文件上传限制(例如:10)", "required": "请输入默认文件上传限制" + }, + "noOfRetrievedDocs": { + "label": "检索文档数量", + "placeholder": "输入检索文档数量", + "required": "请输入检索文档数量" } }, "prompt": { diff --git a/src/components/Option/Settings/rag.tsx b/src/components/Option/Settings/rag.tsx index 12d7d97..fd5d576 100644 --- a/src/components/Option/Settings/rag.tsx +++ b/src/components/Option/Settings/rag.tsx @@ -10,7 +10,7 @@ import { } from "~/services/ollama" import { SettingPrompt } from "./prompt" import { useTranslation } from "react-i18next" -import { getTotalFilePerKB } from "@/services/app" +import { getNoOfRetrievedDocs, getTotalFilePerKB } from "@/services/app" import { SidepanelRag } from "./sidepanel-rag" export const RagSettings = () => { @@ -21,20 +21,28 @@ export const RagSettings = () => { const { data: ollamaInfo, status } = useQuery({ queryKey: ["fetchRAGSettings"], queryFn: async () => { - const [allModels, chunkOverlap, chunkSize, defaultEM, totalFilePerKB] = - await Promise.all([ - getAllModels({ returnEmpty: true }), - defaultEmbeddingChunkOverlap(), - defaultEmbeddingChunkSize(), - defaultEmbeddingModelForRag(), - getTotalFilePerKB() - ]) + const [ + allModels, + chunkOverlap, + chunkSize, + defaultEM, + totalFilePerKB, + noOfRetrievedDocs + ] = await Promise.all([ + getAllModels({ returnEmpty: true }), + defaultEmbeddingChunkOverlap(), + defaultEmbeddingChunkSize(), + defaultEmbeddingModelForRag(), + getTotalFilePerKB(), + getNoOfRetrievedDocs() + ]) return { models: allModels, chunkOverlap, chunkSize, defaultEM, - totalFilePerKB + totalFilePerKB, + noOfRetrievedDocs } } }) @@ -45,8 +53,15 @@ export const RagSettings = () => { chunkSize: number overlap: number totalFilePerKB: number + noOfRetrievedDocs: number }) => { - await saveForRag(data.model, data.chunkSize, data.overlap, data.totalFilePerKB) + await saveForRag( + data.model, + data.chunkSize, + data.overlap, + data.totalFilePerKB, + data.noOfRetrievedDocs + ) return true }, onSuccess: () => { @@ -75,14 +90,16 @@ export const RagSettings = () => { model: data.defaultEM, chunkSize: data.chunkSize, overlap: data.chunkOverlap, - totalFilePerKB: data.totalFilePerKB + totalFilePerKB: data.totalFilePerKB, + noOfRetrievedDocs: data.noOfRetrievedDocs }) }} initialValues={{ chunkSize: ollamaInfo?.chunkSize, chunkOverlap: ollamaInfo?.chunkOverlap, defaultEM: ollamaInfo?.defaultEM, - totalFilePerKB: ollamaInfo?.totalFilePerKB + totalFilePerKB: ollamaInfo?.totalFilePerKB, + noOfRetrievedDocs: ollamaInfo?.noOfRetrievedDocs }}> { /> + + + + { ]}> -

- +
diff --git a/src/hooks/useMessageOption.tsx b/src/hooks/useMessageOption.tsx index a362f69..7dd6d6d 100644 --- a/src/hooks/useMessageOption.tsx +++ b/src/hooks/useMessageOption.tsx @@ -32,6 +32,7 @@ import { useStorage } from "@plasmohq/storage/hook" import { useStoreChatModelSettings } from "@/store/model" import { getAllDefaultModelSettings } from "@/services/model-settings" import { pageAssistModel } from "@/models" +import { getNoOfRetrievedDocs } from "@/services/app" export const useMessageOption = () => { const { @@ -680,8 +681,9 @@ export const useMessageOption = () => { const response = await questionOllama.invoke(promptForQuestion) query = response.content.toString() } + const docSize = await getNoOfRetrievedDocs() - const docs = await vectorstore.similaritySearch(query, 4) + const docs = await vectorstore.similaritySearch(query, docSize) const context = formatDocs(docs) const source = docs.map((doc) => { return { diff --git a/src/services/app.ts b/src/services/app.ts index 72cc441..bbae388 100644 --- a/src/services/app.ts +++ b/src/services/app.ts @@ -108,4 +108,13 @@ export const getTotalFilePerKB = async (): Promise => { export const setTotalFilePerKB = async (totalFilePerKB: number): Promise => { await storage.set("totalFilePerKB", totalFilePerKB); -}; \ No newline at end of file +}; + +export const getNoOfRetrievedDocs = async (): Promise => { + const noOfRetrievedDocs = await storage.get("noOfRetrievedDocs"); + return noOfRetrievedDocs || 4 +} + +export const setNoOfRetrievedDocs = async (noOfRetrievedDocs: number): Promise => { + await storage.set("noOfRetrievedDocs", noOfRetrievedDocs); +} \ No newline at end of file diff --git a/src/services/ollama.ts b/src/services/ollama.ts index 6ce83a8..7b0a6a8 100644 --- a/src/services/ollama.ts +++ b/src/services/ollama.ts @@ -2,7 +2,7 @@ import { Storage } from "@plasmohq/storage" import { cleanUrl } from "../libs/clean-url" import { urlRewriteRuntime } from "../libs/runtime" import { getChromeAIModel } from "./chrome" -import { setTotalFilePerKB } from "./app" +import { setNoOfRetrievedDocs, setTotalFilePerKB } from "./app" const storage = new Storage() @@ -326,12 +326,14 @@ export const saveForRag = async ( model: string, chunkSize: number, overlap: number, - totalFilePerKB: number + totalFilePerKB: number, + noOfRetrievedDocs: number ) => { await setDefaultEmbeddingModelForRag(model) await setDefaultEmbeddingChunkSize(chunkSize) await setDefaultEmbeddingChunkOverlap(overlap) await setTotalFilePerKB(totalFilePerKB) + await setNoOfRetrievedDocs(noOfRetrievedDocs) } export const getWebSearchPrompt = async () => {