feat: Add option to enable internet search by default

This commit is contained in:
n4ze3m 2025-01-12 00:19:39 +05:30
parent 84e123bf38
commit 48b7a2824a
23 changed files with 148 additions and 27 deletions

View File

@ -77,6 +77,9 @@
}, },
"googleDomain": { "googleDomain": {
"label": "نطاق جوجل" "label": "نطاق جوجل"
},
"searchOnByDefault": {
"label": "تفعيل البحث على الإنترنت بشكل افتراضي"
} }
}, },
"system": { "system": {

View File

@ -74,6 +74,9 @@
"braveApi": { "braveApi": {
"label": "Brave API Nøgle", "label": "Brave API Nøgle",
"placeholder": "Indtast din Brave API nøgle" "placeholder": "Indtast din Brave API nøgle"
},
"searchOnByDefault": {
"label": "Internet Søgning TIL som standard"
} }
}, },
"system": { "system": {

View File

@ -74,6 +74,9 @@
"braveApi": { "braveApi": {
"label": "Brave API-Schlüssel", "label": "Brave API-Schlüssel",
"placeholder": "Geben Sie Ihren Brave API-Schlüssel ein" "placeholder": "Geben Sie Ihren Brave API-Schlüssel ein"
},
"searchOnByDefault": {
"label": "Internetsuche standardmäßig aktiviert"
} }
}, },
"system": { "system": {

View File

@ -77,6 +77,9 @@
}, },
"googleDomain": { "googleDomain": {
"label": "Google Domain" "label": "Google Domain"
},
"searchOnByDefault": {
"label": "Internet Search ON by default"
} }
}, },
"system": { "system": {

View File

@ -74,6 +74,9 @@
"braveApi": { "braveApi": {
"label": "Clave API de Brave", "label": "Clave API de Brave",
"placeholder": "Ingrese su clave API de Brave" "placeholder": "Ingrese su clave API de Brave"
},
"searchOnByDefault": {
"label": "Búsqueda en Internet activada por defecto"
} }
}, },
"system": { "system": {

View File

@ -71,6 +71,9 @@
"braveApi": { "braveApi": {
"label": "کلید API بریو", "label": "کلید API بریو",
"placeholder": "کلید API بریو خود را وارد کنید" "placeholder": "کلید API بریو خود را وارد کنید"
},
"searchOnByDefault": {
"label": "جستجوی اینترنتی به صورت پیش‌فرض فعال باشد"
} }
}, },
"system": { "system": {

View File

@ -74,6 +74,9 @@
"braveApi": { "braveApi": {
"label": "Clé API Brave", "label": "Clé API Brave",
"placeholder": "Entrez votre clé API Brave" "placeholder": "Entrez votre clé API Brave"
},
"searchOnByDefault": {
"label": "Recherche Internet activée par défaut"
} }
}, },
"system": { "system": {

View File

@ -74,6 +74,9 @@
"braveApi": { "braveApi": {
"label": "Chiave API Brave", "label": "Chiave API Brave",
"placeholder": "Inserisci la tua chiave API Brave" "placeholder": "Inserisci la tua chiave API Brave"
},
"searchOnByDefault": {
"label": "Ricerca Internet attiva per impostazione predefinita"
} }
}, },
"system": { "system": {

View File

@ -77,6 +77,9 @@
"braveApi": { "braveApi": {
"label": "Brave APIキー", "label": "Brave APIキー",
"placeholder": "Brave APIキーを入力してください" "placeholder": "Brave APIキーを入力してください"
},
"searchOnByDefault": {
"label": "デフォルトでインターネット検索をオンにする"
} }
}, },
"system": { "system": {

View File

@ -77,6 +77,9 @@
"braveApi": { "braveApi": {
"label": "Brave API 키", "label": "Brave API 키",
"placeholder": "Brave API 키를 입력하세요" "placeholder": "Brave API 키를 입력하세요"
},
"searchOnByDefault": {
"label": "기본적으로 인터넷 검색 켜기"
} }
}, },
"system": { "system": {

View File

@ -77,6 +77,9 @@
"braveApi": { "braveApi": {
"label": "ബ്രേവ് API കീ", "label": "ബ്രേവ് API കീ",
"placeholder": "നിങ്ങളുടെ ബ്രേവ് API കീ നൽകുക" "placeholder": "നിങ്ങളുടെ ബ്രേവ് API കീ നൽകുക"
},
"searchOnByDefault": {
"label": "സ്ഥിരസ്ഥിതിയായി ഇന്റർനെറ്റ് തിരച്ചിൽ പ്രവർത്തനക്ഷമമാക്കുക"
} }
}, },
"system": { "system": {

View File

@ -74,6 +74,9 @@
"braveApi": { "braveApi": {
"label": "Brave API Nøkkel", "label": "Brave API Nøkkel",
"placeholder": "Skriv inn din Brave API nøkkel" "placeholder": "Skriv inn din Brave API nøkkel"
},
"searchOnByDefault": {
"label": "Internett-søk PÅ som standard"
} }
}, },
"system": { "system": {

View File

@ -74,6 +74,9 @@
"braveApi": { "braveApi": {
"label": "Chave da API do Brave", "label": "Chave da API do Brave",
"placeholder": "Digite sua chave da API do Brave" "placeholder": "Digite sua chave da API do Brave"
},
"searchOnByDefault": {
"label": "Pesquisa na Internet ativada por padrão"
} }
}, },
"system": { "system": {

View File

@ -75,6 +75,9 @@
"braveApi": { "braveApi": {
"label": "API-ключ Brave", "label": "API-ключ Brave",
"placeholder": "Введите ваш API-ключ Brave" "placeholder": "Введите ваш API-ключ Brave"
},
"searchOnByDefault": {
"label": "Поиск в интернете включен по умолчанию"
} }
}, },
"system": { "system": {

View File

@ -74,6 +74,9 @@
"braveApi": { "braveApi": {
"label": "Brave API-nyckel", "label": "Brave API-nyckel",
"placeholder": "Ange din Brave API-nyckel" "placeholder": "Ange din Brave API-nyckel"
},
"searchOnByDefault": {
"label": "Internetsökning PÅ som standard"
} }
}, },
"system": { "system": {

View File

@ -74,6 +74,9 @@
"braveApi": { "braveApi": {
"label": "Ключ API Brave", "label": "Ключ API Brave",
"placeholder": "Введіть ваш ключ API Brave" "placeholder": "Введіть ваш ключ API Brave"
},
"searchOnByDefault": {
"label": "Пошук в Інтернеті увімкнено за замовчуванням"
} }
}, },
"system": { "system": {

View File

@ -77,6 +77,9 @@
"braveApi": { "braveApi": {
"label": "Brave API 密钥", "label": "Brave API 密钥",
"placeholder": "输入您的 Brave API 密钥" "placeholder": "输入您的 Brave API 密钥"
},
"searchOnByDefault": {
"label": "默认开启网络搜索"
} }
}, },
"system": { "system": {

View File

@ -39,7 +39,8 @@ export const PlaygroundForm = ({ dropedFile }: Props) => {
selectedKnowledge, selectedKnowledge,
temporaryChat, temporaryChat,
useOCR, useOCR,
setUseOCR setUseOCR,
defaultInternetSearchOn
} = useMessageOption() } = useMessageOption()
const isMobile = () => { const isMobile = () => {
@ -71,8 +72,17 @@ export const PlaygroundForm = ({ dropedFile }: Props) => {
React.useEffect(() => { React.useEffect(() => {
textAreaFocus() textAreaFocus()
if (defaultInternetSearchOn) {
setWebSearch(true)
}
}, []) }, [])
React.useEffect(() => {
if (defaultInternetSearchOn) {
setWebSearch(true)
}
}, [defaultInternetSearchOn])
const onInputChange = async ( const onInputChange = async (
e: React.ChangeEvent<HTMLInputElement> | File e: React.ChangeEvent<HTMLInputElement> | File
) => { ) => {

View File

@ -19,7 +19,8 @@ export const SearchModeSettings = () => {
searxngURL: "", searxngURL: "",
searxngJSONMode: false, searxngJSONMode: false,
braveApiKey: "", braveApiKey: "",
googleDomain: "" googleDomain: "",
defaultInternetSearchOn: false
} }
}) })
@ -171,6 +172,19 @@ export const SearchModeSettings = () => {
</div> </div>
</div> </div>
<div className="flex sm:flex-row flex-col space-y-4 sm:space-y-0 sm:justify-between">
<span className="text-gray-700 dark:text-neutral-50 ">
{t("generalSettings.webSearch.searchOnByDefault.label")}
</span>
<div>
<Switch
className="mt-4 sm:mt-0"
{...form.getInputProps("defaultInternetSearchOn", {
type: "checkbox"
})}
/>
</div>
</div>
<div className="flex justify-end"> <div className="flex justify-end">
<SaveButton btnType="submit" /> <SaveButton btnType="submit" />
</div> </div>

View File

@ -133,7 +133,8 @@ export const SidepanelForm = ({ dropedFile }: Props) => {
setSelectedQuickPrompt, setSelectedQuickPrompt,
speechToTextLanguage, speechToTextLanguage,
useOCR, useOCR,
setUseOCR setUseOCR,
defaultInternetSearchOn
} = useMessage() } = useMessage()
React.useEffect(() => { React.useEffect(() => {
@ -194,12 +195,23 @@ export const SidepanelForm = ({ dropedFile }: Props) => {
} }
textareaRef.current?.addEventListener("drop", handleDrop) textareaRef.current?.addEventListener("drop", handleDrop)
textareaRef.current?.addEventListener("dragover", handleDragOver) textareaRef.current?.addEventListener("dragover", handleDragOver)
if (defaultInternetSearchOn) {
setWebSearch(true)
}
return () => { return () => {
textareaRef.current?.removeEventListener("drop", handleDrop) textareaRef.current?.removeEventListener("drop", handleDrop)
textareaRef.current?.removeEventListener("dragover", handleDragOver) textareaRef.current?.removeEventListener("dragover", handleDragOver)
} }
}, []) }, [])
React.useEffect(() => {
if (defaultInternetSearchOn) {
setWebSearch(true)
}
}, [defaultInternetSearchOn])
return ( return (
<div className="px-3 pt-3 md:px-6 md:pt-6 bg-gray-50 dark:bg-[#262626] border rounded-t-xl border-black/10 dark:border-gray-600"> <div className="px-3 pt-3 md:px-6 md:pt-6 bg-gray-50 dark:bg-[#262626] border rounded-t-xl border-black/10 dark:border-gray-600">
<div <div
@ -302,7 +314,7 @@ export const SidepanelForm = ({ dropedFile }: Props) => {
chatMode === "rag" ? "hidden" : "block" chatMode === "rag" ? "hidden" : "block"
}`}> }`}>
{webSearch ? ( {webSearch ? (
<PiGlobe className="h-5 w-5 dark:text-gray-300" /> <PiGlobe className="h-5 w-5 text-blue-600 dark:text-blue-400" />
) : ( ) : (
<PiGlobeX className="h-5 w-5 text-gray-600 dark:text-gray-400" /> <PiGlobeX className="h-5 w-5 text-gray-600 dark:text-gray-400" />
)} )}

View File

@ -55,7 +55,10 @@ export const useMessage = () => {
setWebSearch, setWebSearch,
isSearchingInternet isSearchingInternet
} = useStoreMessageOption() } = useStoreMessageOption()
const [defaultInternetSearchOn, ] = useStorage(
"defaultInternetSearchOn",
false
)
const [chatWithWebsiteEmbedding] = useStorage( const [chatWithWebsiteEmbedding] = useStorage(
"chatWithWebsiteEmbedding", "chatWithWebsiteEmbedding",
true true
@ -107,6 +110,9 @@ export const useMessage = () => {
setIsProcessing(false) setIsProcessing(false)
setStreaming(false) setStreaming(false)
currentChatModelSettings.reset() currentChatModelSettings.reset()
if(defaultInternetSearchOn) {
setWebSearch(true)
}
} }
const chatWithWebsiteMode = async ( const chatWithWebsiteMode = async (
@ -1714,6 +1720,7 @@ export const useMessage = () => {
speechToTextLanguage, speechToTextLanguage,
setSpeechToTextLanguage, setSpeechToTextLanguage,
useOCR, useOCR,
setUseOCR setUseOCR,
defaultInternetSearchOn
} }
} }

View File

@ -76,6 +76,10 @@ export const useMessageOption = () => {
} = useStoreMessageOption() } = useStoreMessageOption()
const currentChatModelSettings = useStoreChatModelSettings() const currentChatModelSettings = useStoreChatModelSettings()
const [selectedModel, setSelectedModel] = useStorage("selectedModel") const [selectedModel, setSelectedModel] = useStorage("selectedModel")
const [defaultInternetSearchOn, ] = useStorage(
"defaultInternetSearchOn",
false
)
const [speechToTextLanguage, setSpeechToTextLanguage] = useStorage( const [speechToTextLanguage, setSpeechToTextLanguage] = useStorage(
"speechToTextLanguage", "speechToTextLanguage",
"en-US" "en-US"
@ -98,6 +102,9 @@ export const useMessageOption = () => {
setStreaming(false) setStreaming(false)
currentChatModelSettings.reset() currentChatModelSettings.reset()
textareaRef?.current?.focus() textareaRef?.current?.focus()
if(defaultInternetSearchOn) {
setWebSearch(true)
}
} }
const searchChatMode = async ( const searchChatMode = async (
@ -1198,6 +1205,7 @@ export const useMessageOption = () => {
temporaryChat, temporaryChat,
setTemporaryChat, setTemporaryChat,
useOCR, useOCR,
setUseOCR setUseOCR,
defaultInternetSearchOn,
} }
} }

View File

@ -26,7 +26,6 @@ export const getIsVisitSpecificWebsite = async () => {
return isVisitSpecificWebsite === "true" return isVisitSpecificWebsite === "true"
} }
export const setIsVisitSpecificWebsite = async ( export const setIsVisitSpecificWebsite = async (
isVisitSpecificWebsite: boolean isVisitSpecificWebsite: boolean
) => { ) => {
@ -101,23 +100,39 @@ export const setGoogleDomain = async (domain: string) => {
await storage2.set("searchGoogleDomain", domain) await storage2.set("searchGoogleDomain", domain)
} }
export const getInternetSearchOn = async () => {
const defaultInternetSearchOn = await storage.get<boolean | undefined>(
"defaultInternetSearchOn"
)
return defaultInternetSearchOn ?? false
}
export const setInternetSearchOn = async (defaultInternetSearchOn: boolean) => {
await storage.set("defaultInternetSearchOn", defaultInternetSearchOn)
}
export const getSearchSettings = async () => { export const getSearchSettings = async () => {
const [isSimpleInternetSearch, searchProvider, totalSearchResult, visitSpecificWebsite, const [
isSimpleInternetSearch,
searchProvider,
totalSearchResult,
visitSpecificWebsite,
searxngURL, searxngURL,
searxngJSONMode, searxngJSONMode,
braveApiKey, braveApiKey,
googleDomain googleDomain,
] = defaultInternetSearchOn
await Promise.all([ ] = await Promise.all([
getIsSimpleInternetSearch(), getIsSimpleInternetSearch(),
getSearchProvider(), getSearchProvider(),
totalSearchResults(), totalSearchResults(),
getIsVisitSpecificWebsite(), getIsVisitSpecificWebsite(),
getSearxngURL(), getSearxngURL(),
isSearxngJSONMode(), isSearxngJSONMode(),
getBraveApiKey(), getBraveApiKey(),
getGoogleDomain() getGoogleDomain(),
]) getInternetSearchOn()
])
return { return {
isSimpleInternetSearch, isSimpleInternetSearch,
@ -127,7 +142,8 @@ export const getSearchSettings = async () => {
searxngURL, searxngURL,
searxngJSONMode, searxngJSONMode,
braveApiKey, braveApiKey,
googleDomain googleDomain,
defaultInternetSearchOn
} }
} }
@ -139,16 +155,18 @@ export const setSearchSettings = async ({
searxngJSONMode, searxngJSONMode,
searxngURL, searxngURL,
braveApiKey, braveApiKey,
googleDomain googleDomain,
defaultInternetSearchOn
}: { }: {
isSimpleInternetSearch: boolean isSimpleInternetSearch: boolean
searchProvider: string searchProvider: string
totalSearchResults: number totalSearchResults: number
visitSpecificWebsite: boolean visitSpecificWebsite: boolean
searxngURL: string searxngURL: string
searxngJSONMode: boolean, searxngJSONMode: boolean
braveApiKey: string, braveApiKey: string
googleDomain: string googleDomain: string,
defaultInternetSearchOn: boolean
}) => { }) => {
await Promise.all([ await Promise.all([
setIsSimpleInternetSearch(isSimpleInternetSearch), setIsSimpleInternetSearch(isSimpleInternetSearch),
@ -158,6 +176,7 @@ export const setSearchSettings = async ({
setSearxngJSONMode(searxngJSONMode), setSearxngJSONMode(searxngJSONMode),
setSearxngURL(searxngURL), setSearxngURL(searxngURL),
setBraveApiKey(braveApiKey), setBraveApiKey(braveApiKey),
setGoogleDomain(googleDomain) setGoogleDomain(googleDomain),
setInternetSearchOn(defaultInternetSearchOn)
]) ])
} }