feat(settings): add Ollama connection status check setting

- Add new setting to enable/disable Ollama connection status check
- Update translations for the new setting across all supported languages
This commit is contained in:
n4ze3m 2024-11-17 12:26:14 +05:30
parent ca26e059eb
commit 92013f3bfc
36 changed files with 148 additions and 59 deletions

View File

@ -25,5 +25,6 @@
"stopStreaming": "Stop Streaming",
"knowledge": "Viden"
},
"sendWhenEnter": "Søg, når Indtast trykkes"
"sendWhenEnter": "Søg, når Indtast trykkes",
"welcome": "Hej! Hvordan kan jeg hjælpe dig i dag?"
}

View File

@ -32,6 +32,9 @@
},
"generateTitle": {
"label": "Generer titel med AI"
},
"ollamaStatus": {
"label": "Aktivér eller deaktivér Ollama forbindelsesstatus kontrol"
}
},
"sidepanelRag": {

View File

@ -25,5 +25,6 @@
"stopStreaming": "Streaming stoppen",
"knowledge": "Wissen"
},
"sendWhenEnter": "Senden bei Drücken der Eingabetaste"
"sendWhenEnter": "Senden bei Drücken der Eingabetaste",
"welcome": "Hallo! Wie kann ich Ihnen heute helfen?"
}

View File

@ -32,6 +32,9 @@
},
"generateTitle": {
"label": "Titel mit KI generieren"
},
"ollamaStatus": {
"label": "Ollama-Verbindungsstatus-Überprüfung aktivieren oder deaktivieren"
}
},
"sidepanelRag": {

View File

@ -25,5 +25,6 @@
"stopStreaming": "Stop Streaming",
"knowledge": "Knowledge"
},
"sendWhenEnter": "Send when Enter pressed"
"sendWhenEnter": "Send when Enter pressed",
"welcome": "Hello! How can I help you today?"
}

View File

@ -32,6 +32,9 @@
},
"generateTitle": {
"label": "Generate Title using AI"
},
"ollamaStatus" :{
"label":"Enable or disable Ollama connection status check"
}
},
"sidepanelRag": {

View File

@ -25,5 +25,6 @@
"stopStreaming": "Parar Transmisión",
"knowledge": "Conocimiento"
},
"sendWhenEnter": "Enviar cuando presione Enter"
"sendWhenEnter": "Enviar cuando presione Enter",
"welcome": "¡Hola! ¿Cómo puedo ayudarte hoy?"
}

View File

@ -32,6 +32,9 @@
},
"generateTitle": {
"label": "Generar título usando IA"
},
"ollamaStatus": {
"label": "Habilitar o deshabilitar la verificación del estado de conexión de Ollama"
}
},
"sidepanelRag": {

View File

@ -25,5 +25,6 @@
"stopStreaming": "توقف Streaming",
"knowledge": "دانش"
},
"sendWhenEnter": "با فشار دادن Enter ارسال شود"
"sendWhenEnter": "با فشار دادن Enter ارسال شود",
"welcome": "سلام! امروز چطور می‌توانم به شما کمک کنم؟"
}

View File

@ -32,6 +32,9 @@
},
"generateTitle": {
"label": "تولید عنوان با استفاده از هوش مصنوعی"
},
"ollamaStatus": {
"label": "فعال یا غیرفعال کردن بررسی وضعیت اتصال Ollama"
}
},
"sidepanelRag": {

View File

@ -25,5 +25,6 @@
"stopStreaming": "Arrêtez la diffusion",
"knowledge": "Connaissance"
},
"sendWhenEnter": "Envoyer en appuyant sur Entrée"
"sendWhenEnter": "Envoyer en appuyant sur Entrée",
"welcome": "Bonjour ! Comment puis-je vous aider aujourd'hui ?"
}

View File

@ -32,6 +32,9 @@
},
"generateTitle": {
"label": "Générer le titre en utilisant l'IA"
},
"ollamaStatus": {
"label": "Activer ou désactiver la vérification de l'état de la connexion Ollama"
}
},
"sidepanelRag": {

View File

@ -25,5 +25,6 @@
"stopStreaming": "Ferma lo Streaming",
"knowledge": "Conoscenza"
},
"sendWhenEnter": "Invia subito dopo Enter"
"sendWhenEnter": "Invia subito dopo Enter",
"welcome": "Ciao! Come posso aiutarti oggi?"
}

View File

@ -32,6 +32,9 @@
},
"generateTitle": {
"label": "Genera titolo utilizzando l'IA"
},
"ollamaStatus": {
"label": "Abilita o disabilita il controllo dello stato della connessione Ollama"
}
},
"sidepanelRag": {

View File

@ -25,5 +25,6 @@
"stopStreaming": "ストリーミングを停止",
"knowledge": "知識"
},
"sendWhenEnter": "Enterキーを押すと送信"
"sendWhenEnter": "Enterキーを押すと送信",
"welcome": "こんにちは!本日はどのようなお手伝いができますか?"
}

View File

@ -35,6 +35,9 @@
},
"generateTitle": {
"label": "AIを使用してタイトルを生成"
},
"ollamaStatus": {
"label": "Ollamaの接続状態チェックを有効または無効にする"
}
},
"sidepanelRag": {

View File

@ -25,5 +25,6 @@
"stopStreaming": "스트리밍 중지",
"knowledge": "지식"
},
"sendWhenEnter": "Enter 키를 누르면 전송"
"sendWhenEnter": "Enter 키를 누르면 전송",
"welcome": "안녕하세요! 오늘 어떻게 도와드릴까요?"
}

View File

@ -35,6 +35,9 @@
},
"generateTitle": {
"label": "AI로 제목 생성"
},
"ollamaStatus": {
"label": "Ollama 연결 상태 확인 활성화 또는 비활성화"
}
},
"sidepanelRag": {
@ -342,4 +345,3 @@
"title": "Chrome AI 설정"
}
}

View File

@ -25,5 +25,6 @@
"stopStreaming": "സ്ട്രീമിംഗ് നിർത്തുക",
"knowledge": "അറിവ്"
},
"sendWhenEnter": "എന്റര്‍ അമര്‍ത്തുമ്പോള്‍ അയയ്ക്കുക"
"sendWhenEnter": "എന്റര്‍ അമര്‍ത്തുമ്പോള്‍ അയയ്ക്കുക",
"welcome": "നമസ്കാരം! ഇന്ന് എനിക്ക് നിങ്ങളെ എങ്ങനെ സഹായിക്കാൻ കഴിയും?"
}

View File

@ -35,6 +35,9 @@
},
"generateTitle": {
"label": "എഐ ഉപയോഗിച്ച് ശീർഷകം സൃഷ്ടിക്കുക"
},
"ollamaStatus": {
"label": "ഒല്ലാമ കണക്ഷൻ സ്റ്റാറ്റസ് പരിശോധന പ്രവർത്തനക്ഷമമാക്കുകയോ പ്രവർത്തനരഹിതമാക്കുകയോ ചെയ്യുക"
}
},
"sidepanelRag": {

View File

@ -25,5 +25,6 @@
"stopStreaming": "Stopp Streaming",
"knowledge": "Kunnskap"
},
"sendWhenEnter": "Søk når Enter trykkes"
"sendWhenEnter": "Søk når Enter trykkes",
"welcome": "Hei! Hvordan kan jeg hjelpe deg i dag?"
}

View File

@ -32,6 +32,9 @@
},
"generateTitle": {
"label": "Generer tittel med AI"
},
"ollamaStatus": {
"label": "Aktiver eller deaktiver Ollama tilkoblingsstatussjekk"
}
},
"sidepanelRag": {

View File

@ -25,5 +25,6 @@
"stopStreaming": "Parar Streaming",
"knowledge": "Conhecimento"
},
"sendWhenEnter": "Enviar ao pressionar Enter"
"sendWhenEnter": "Enviar ao pressionar Enter",
"welcome": "Olá! Como posso ajudar você hoje?"
}

View File

@ -32,6 +32,9 @@
},
"generateTitle": {
"label": "Gerar título usando IA"
},
"ollamaStatus": {
"label": "Ativar ou desativar verificação de status da conexão Ollama"
}
},
"sidepanelRag": {

View File

@ -25,5 +25,6 @@
"stopStreaming": "Остановить поток",
"knowledge": "Знание"
},
"sendWhenEnter": "Отправить при нажатии клавиши Enter"
"sendWhenEnter": "Отправить при нажатии клавиши Enter",
"welcome": "Здравствуйте! Как я могу помочь вам сегодня?"
}

View File

@ -32,6 +32,9 @@
},
"generateTitle": {
"label": "Сгенерировать заголовок с помощью ИИ"
},
"ollamaStatus": {
"label": "Включить или отключить проверку состояния подключения Ollama"
}
},
"sidepanelRag": {

View File

@ -25,5 +25,6 @@
"stopStreaming": "Stoppa strömning",
"knowledge": "Kunskap"
},
"sendWhenEnter": "Skicka när Enter trycks"
"sendWhenEnter": "Skicka när Enter trycks",
"welcome": "Hej! Hur kan jag hjälpa dig idag?"
}

View File

@ -32,6 +32,9 @@
},
"generateTitle": {
"label": "Generera titel med AI"
},
"ollamaStatus": {
"label": "Aktivera eller inaktivera Ollama anslutningsstatuskontroll"
}
},
"sidepanelRag": {

View File

@ -25,5 +25,6 @@
"stopStreaming": "停止流媒体",
"knowledge": "知识"
},
"sendWhenEnter": "按Enter发送"
"sendWhenEnter": "按Enter发送",
"welcome": "你好!今天我能帮你什么?"
}

View File

@ -35,6 +35,9 @@
},
"generateTitle": {
"label": "使用人工智能生成标题"
},
"ollamaStatus": {
"label": "启用或禁用Ollama连接状态检查"
}
},
"sidepanelRag": {

View File

@ -113,6 +113,7 @@ export const Header: React.FC<Props> = ({
<PageAssistSelect
className="w-80"
placeholder={t("common:selectAModel")}
loadingText={t("common:selectAModel")}
value={selectedModel}
onChange={(e) => {
setSelectedModel(e.value)

View File

@ -1,4 +1,5 @@
import { cleanUrl } from "@/libs/clean-url"
import { useStorage } from "@plasmohq/storage/hook"
import { useQuery } from "@tanstack/react-query"
import { RotateCcw } from "lucide-react"
import { useEffect, useState } from "react"
@ -12,6 +13,9 @@ import {
export const PlaygroundEmpty = () => {
const [ollamaURL, setOllamaURL] = useState<string>("")
const { t } = useTranslation(["playground", "common"])
const [checkOllamaStatus] = useStorage("checkOllamaStatus", true)
const {
data: ollamaInfo,
status: ollamaStatus,
@ -23,19 +27,32 @@ export const PlaygroundEmpty = () => {
const ollamaURL = await getOllamaURL()
const isOk = await isOllamaRunning()
if (ollamaURL) {
saveOllamaURL(ollamaURL)
}
return {
isOk,
ollamaURL
}
}
},
enabled: checkOllamaStatus
})
useEffect(() => {
if (ollamaInfo?.ollamaURL) {
setOllamaURL(ollamaInfo.ollamaURL)
if (!checkOllamaStatus) {
return (
<div className="mx-auto sm:max-w-xl px-4 mt-10">
<div className="rounded-lg justify-center items-center flex flex-col border p-8 bg-gray-50 dark:bg-[#262626] dark:border-gray-600">
<h1 className="text-sm font-medium text-center text-gray-500 dark:text-gray-400 flex gap-3 items-center justify-center">
<span >👋</span>
<span className="text-gray-700 dark:text-gray-300">
{t("welcome")}
</span>
</h1>
</div>
</div>
)
}
}, [ollamaInfo])
return (
<div className="mx-auto sm:max-w-xl px-4 mt-10">
<div className="rounded-lg justify-center items-center flex flex-col border p-8 bg-gray-50 dark:bg-[#262626] dark:border-gray-600">

View File

@ -16,8 +16,7 @@ import {
import { useStorage } from "@plasmohq/storage/hook"
export const GeneralSettings = () => {
const { clearChat } =
useMessageOption()
const { clearChat } = useMessageOption()
const [speechToTextLanguage, setSpeechToTextLanguage] = useStorage(
"speechToTextLanguage",
@ -41,6 +40,11 @@ export const GeneralSettings = () => {
const [sendNotificationAfterIndexing, setSendNotificationAfterIndexing] =
useStorage("sendNotificationAfterIndexing", false)
const [checkOllamaStatus, setCheckOllamaStatus] = useStorage(
"checkOllamaStatus",
true
)
const queryClient = useQueryClient()
const { mode, toggleDarkMode } = useDarkMode()
@ -160,6 +164,19 @@ export const GeneralSettings = () => {
/>
</div>
<div className="flex flex-row justify-between">
<div className="inline-flex items-center gap-2">
<span className="text-gray-700 dark:text-neutral-50">
{t("generalSettings.settings.ollamaStatus.label")}
</span>
</div>
<Switch
checked={checkOllamaStatus}
onChange={(checked) => setCheckOllamaStatus(checked)}
/>
</div>
<div className="flex flex-row justify-between">
<span className="text-gray-700 dark:text-neutral-50 ">
{t("generalSettings.settings.darkMode.label")}

View File

@ -235,14 +235,16 @@ export const PageAssistSelect: React.FC<SelectProps> = ({
onClick={() => !disabled && !isLoading && setIsOpen(!isOpen)}
onKeyDown={handleKeyDown}
className={`${defaultSelectClass} ${className}`}>
<span className="!truncate flex items-center gap-2 ">
<span className="!truncate flex items-center gap-2 select-none">
{isLoading && <LoadingIndicator />}
{isLoading ? (
loadingText
) : selectedOption ? (
selectedOption.label
) : (
<span className="dark:text-gray-400 text-sm">{placeholder}</span>
<span className="dark:text-gray-500 font-semibold text-[14px]">
{placeholder}
</span>
)}
</span>
<ChevronDown

View File

@ -1,4 +1,5 @@
import { cleanUrl } from "@/libs/clean-url"
import { useStorage } from "@plasmohq/storage/hook"
import { useQuery, useQueryClient } from "@tanstack/react-query"
import { Select } from "antd"
import { RotateCcw } from "lucide-react"
@ -17,13 +18,15 @@ export const EmptySidePanel = () => {
const [ollamaURL, setOllamaURL] = useState<string>("")
const { t } = useTranslation(["playground", "common"])
const queryClient = useQueryClient()
const [checkOllamaStatus] = useStorage("checkOllamaStatus", true)
const {
data: ollamaInfo,
status: ollamaStatus,
refetch,
isRefetching
} = useQuery({
queryKey: ["ollamaStatus"],
queryKey: ["ollamaStatus", checkOllamaStatus],
queryFn: async () => {
const ollamaURL = await getOllamaURL()
const isOk = await isOllamaRunning()
@ -32,7 +35,7 @@ export const EmptySidePanel = () => {
queryKey: ["getAllModelsForSelect"]
})
return {
isOk,
isOk: checkOllamaStatus ? isOk : true,
models,
ollamaURL
}
@ -59,7 +62,7 @@ export const EmptySidePanel = () => {
</p>
</div>
)}
{!isRefetching && ollamaStatus === "success" ? (
{!isRefetching && ollamaStatus === "success" && checkOllamaStatus ? (
ollamaInfo.isOk ? (
<div className="inline-flex items-center space-x-2">
<div className="w-3 h-3 bg-green-500 rounded-full"></div>

View File

@ -102,6 +102,7 @@ export const getAllModels = async ({
returnEmpty?: boolean
}) => {
try {
const baseUrl = await getOllamaURL()
const response = await fetcher(`${cleanUrl(baseUrl)}/api/tags`)
if (!response.ok) {
@ -178,30 +179,9 @@ export const fetchChatModels = async ({
returnEmpty?: boolean
}) => {
try {
const baseUrl = await getOllamaURL()
const response = await fetcher(`${cleanUrl(baseUrl)}/api/tags`)
if (!response.ok) {
if (returnEmpty) {
return []
}
throw new Error(response.statusText)
}
const json = await response.json()
const models = json.models as {
name: string
model: string
modified_at: string
size: number
digest: string
details?: {
parent_model?: string
format: string
family: string
families: string[]
parameter_size: string
quantization_level: string
}
}[]
const models = await getAllModels({ returnEmpty })
const chatModels = models
?.filter((model) => {
return (
@ -408,3 +388,13 @@ export const getPageShareUrl = async () => {
export const setPageShareUrl = async (pageShareUrl: string) => {
await storage.set("pageShareUrl", pageShareUrl)
}
export const isOllamaEnabled = async () => {
const ollamaStatus = await storage.get<boolean>("checkOllamaStatus")
// if data is empty or null then return true
if (typeof ollamaStatus === "undefined" || ollamaStatus === null) {
return true
}
return ollamaStatus
}