forked from open-webui/open-webui
		
	chore: version check refac
This commit is contained in:
		
							parent
							
								
									cc49e0d10f
								
							
						
					
					
						commit
						b777b6d2aa
					
				
					 5 changed files with 56 additions and 35 deletions
				
			
		|  | @ -32,7 +32,7 @@ export const getOllamaVersion = async ( | ||||||
| 		throw error; | 		throw error; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return res?.version ?? '0'; | 	return res?.version ?? ''; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| export const getOllamaModels = async ( | export const getOllamaModels = async ( | ||||||
|  |  | ||||||
|  | @ -9,10 +9,11 @@ | ||||||
| 	} from '$lib/constants'; | 	} from '$lib/constants'; | ||||||
| 	import toast from 'svelte-french-toast'; | 	import toast from 'svelte-french-toast'; | ||||||
| 	import { onMount } from 'svelte'; | 	import { onMount } from 'svelte'; | ||||||
| 	import { config, info, models, settings, user } from '$lib/stores'; | 	import { config, models, settings, user } from '$lib/stores'; | ||||||
| 	import { splitStream, getGravatarURL } from '$lib/utils'; | 	import { splitStream, getGravatarURL } from '$lib/utils'; | ||||||
| 	import Advanced from './Settings/Advanced.svelte'; | 	import Advanced from './Settings/Advanced.svelte'; | ||||||
| 	import { stringify } from 'postcss'; | 	import { stringify } from 'postcss'; | ||||||
|  | 	import { getOllamaVersion } from '$lib/apis/ollama'; | ||||||
| 
 | 
 | ||||||
| 	export let show = false; | 	export let show = false; | ||||||
| 
 | 
 | ||||||
|  | @ -79,6 +80,9 @@ | ||||||
| 	let authType = 'Basic'; | 	let authType = 'Basic'; | ||||||
| 	let authContent = ''; | 	let authContent = ''; | ||||||
| 
 | 
 | ||||||
|  | 	// About | ||||||
|  | 	let ollamaVersion = ''; | ||||||
|  | 
 | ||||||
| 	const checkOllamaConnection = async () => { | 	const checkOllamaConnection = async () => { | ||||||
| 		if (API_BASE_URL === '') { | 		if (API_BASE_URL === '') { | ||||||
| 			API_BASE_URL = OLLAMA_API_BASE_URL; | 			API_BASE_URL = OLLAMA_API_BASE_URL; | ||||||
|  | @ -553,7 +557,7 @@ | ||||||
| 		return models; | 		return models; | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
| 	onMount(() => { | 	onMount(async () => { | ||||||
| 		let settings = JSON.parse(localStorage.getItem('settings') ?? '{}'); | 		let settings = JSON.parse(localStorage.getItem('settings') ?? '{}'); | ||||||
| 		console.log(settings); | 		console.log(settings); | ||||||
| 
 | 
 | ||||||
|  | @ -586,6 +590,13 @@ | ||||||
| 			authType = settings.authHeader.split(' ')[0]; | 			authType = settings.authHeader.split(' ')[0]; | ||||||
| 			authContent = settings.authHeader.split(' ')[1]; | 			authContent = settings.authHeader.split(' ')[1]; | ||||||
| 		} | 		} | ||||||
|  | 
 | ||||||
|  | 		ollamaVersion = await getOllamaVersion( | ||||||
|  | 			API_BASE_URL ?? OLLAMA_API_BASE_URL, | ||||||
|  | 			localStorage.token | ||||||
|  | 		).catch((error) => { | ||||||
|  | 			return ''; | ||||||
|  | 		}); | ||||||
| 	}); | 	}); | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
|  | @ -1607,7 +1618,7 @@ | ||||||
| 								<div class=" mb-2.5 text-sm font-medium">Ollama Version</div> | 								<div class=" mb-2.5 text-sm font-medium">Ollama Version</div> | ||||||
| 								<div class="flex w-full"> | 								<div class="flex w-full"> | ||||||
| 									<div class="flex-1 text-xs text-gray-700 dark:text-gray-200"> | 									<div class="flex-1 text-xs text-gray-700 dark:text-gray-200"> | ||||||
| 										{$info?.ollama?.version ?? 'N/A'} | 										{ollamaVersion ?? 'N/A'} | ||||||
| 									</div> | 									</div> | ||||||
| 								</div> | 								</div> | ||||||
| 							</div> | 							</div> | ||||||
|  |  | ||||||
|  | @ -1,7 +1,6 @@ | ||||||
| import { writable } from 'svelte/store'; | import { writable } from 'svelte/store'; | ||||||
| 
 | 
 | ||||||
| // Backend
 | // Backend
 | ||||||
| export const info = writable({}); |  | ||||||
| export const config = writable(undefined); | export const config = writable(undefined); | ||||||
| export const user = writable(undefined); | export const user = writable(undefined); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -100,3 +100,13 @@ export const copyToClipboard = (text) => { | ||||||
| 		} | 		} | ||||||
| 	); | 	); | ||||||
| }; | }; | ||||||
|  | 
 | ||||||
|  | export const checkVersion = (required, current) => { | ||||||
|  | 	return ( | ||||||
|  | 		current.localeCompare(required, undefined, { | ||||||
|  | 			numeric: true, | ||||||
|  | 			sensitivity: 'case', | ||||||
|  | 			caseFirst: 'upper' | ||||||
|  | 		}) < 0 | ||||||
|  | 	); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | @ -1,24 +1,31 @@ | ||||||
| <script lang="ts"> | <script lang="ts"> | ||||||
| 	import { v4 as uuidv4 } from 'uuid'; | 	import toast from 'svelte-french-toast'; | ||||||
| 	import { onMount, tick } from 'svelte'; | 	import { onMount, tick } from 'svelte'; | ||||||
| 	import { goto } from '$app/navigation'; | 	import { goto } from '$app/navigation'; | ||||||
| 	import toast from 'svelte-french-toast'; |  | ||||||
| 
 | 
 | ||||||
| 	import { info, user, showSettings, settings, models, modelfiles } from '$lib/stores'; |  | ||||||
| 
 |  | ||||||
| 	import { OLLAMA_API_BASE_URL, REQUIRED_OLLAMA_VERSION, WEBUI_API_BASE_URL } from '$lib/constants'; |  | ||||||
| 	import { getOllamaModels, getOllamaVersion } from '$lib/apis/ollama'; | 	import { getOllamaModels, getOllamaVersion } from '$lib/apis/ollama'; | ||||||
| 	import { getOpenAIModels } from '$lib/apis/openai'; | 	import { getOpenAIModels } from '$lib/apis/openai'; | ||||||
| 
 | 
 | ||||||
|  | 	import { user, showSettings, settings, models, modelfiles } from '$lib/stores'; | ||||||
|  | 	import { OLLAMA_API_BASE_URL, REQUIRED_OLLAMA_VERSION, WEBUI_API_BASE_URL } from '$lib/constants'; | ||||||
|  | 
 | ||||||
| 	import SettingsModal from '$lib/components/chat/SettingsModal.svelte'; | 	import SettingsModal from '$lib/components/chat/SettingsModal.svelte'; | ||||||
| 	import Sidebar from '$lib/components/layout/Sidebar.svelte'; | 	import Sidebar from '$lib/components/layout/Sidebar.svelte'; | ||||||
|  | 	import { checkVersion } from '$lib/utils'; | ||||||
| 
 | 
 | ||||||
|  | 	let ollamaVersion = ''; | ||||||
| 	let loaded = false; | 	let loaded = false; | ||||||
| 
 | 
 | ||||||
| 	const getModels = async () => { | 	const getModels = async () => { | ||||||
| 		let models = []; | 		let models = []; | ||||||
| 		models.push( | 		models.push( | ||||||
| 			...(await getOllamaModels($settings?.API_BASE_URL ?? OLLAMA_API_BASE_URL, localStorage.token)) | 			...(await getOllamaModels( | ||||||
|  | 				$settings?.API_BASE_URL ?? OLLAMA_API_BASE_URL, | ||||||
|  | 				localStorage.token | ||||||
|  | 			).catch((error) => { | ||||||
|  | 				toast.error(error); | ||||||
|  | 				return []; | ||||||
|  | 			})) | ||||||
| 		); | 		); | ||||||
| 		// If OpenAI API Key exists | 		// If OpenAI API Key exists | ||||||
| 		if ($settings.OPENAI_API_KEY) { | 		if ($settings.OPENAI_API_KEY) { | ||||||
|  | @ -42,42 +49,36 @@ | ||||||
| 				$settings?.API_BASE_URL ?? OLLAMA_API_BASE_URL, | 				$settings?.API_BASE_URL ?? OLLAMA_API_BASE_URL, | ||||||
| 				localStorage.token | 				localStorage.token | ||||||
| 			).catch((error) => { | 			).catch((error) => { | ||||||
| 				return '0'; | 				return ''; | ||||||
| 			}); | 			}); | ||||||
| 		} | 		} | ||||||
| 		await info.set({ ...$info, ollama: { version: version } }); |  | ||||||
| 
 | 
 | ||||||
| 		if ( | 		ollamaVersion = version; | ||||||
| 			version.localeCompare(REQUIRED_OLLAMA_VERSION, undefined, { | 
 | ||||||
| 				numeric: true, | 		console.log(ollamaVersion); | ||||||
| 				sensitivity: 'case', | 		if (checkVersion(REQUIRED_OLLAMA_VERSION, ollamaVersion)) { | ||||||
| 				caseFirst: 'upper' | 			toast.error(`Ollama Version: ${ollamaVersion !== '' ? ollamaVersion : 'Not Detected'}`); | ||||||
| 			}) < 0 |  | ||||||
| 		) { |  | ||||||
| 			toast.error(`Ollama Version: ${version}`); |  | ||||||
| 		} | 		} | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
| 	onMount(async () => { | 	onMount(async () => { | ||||||
| 		if ($user === undefined) { | 		if ($user === undefined) { | ||||||
| 			await goto('/auth'); | 			await goto('/auth'); | ||||||
|  | 		} else if (['user', 'admin'].includes($user.role)) { | ||||||
|  | 			await settings.set(JSON.parse(localStorage.getItem('settings') ?? '{}')); | ||||||
|  | 			await models.set(await getModels()); | ||||||
|  | 
 | ||||||
|  | 			await modelfiles.set(JSON.parse(localStorage.getItem('modelfiles') ?? '[]')); | ||||||
|  | 			modelfiles.subscribe(async () => { | ||||||
|  | 				// should fetch models | ||||||
|  | 			}); | ||||||
|  | 
 | ||||||
|  | 			await setOllamaVersion(); | ||||||
|  | 			await tick(); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		await settings.set(JSON.parse(localStorage.getItem('settings') ?? '{}')); |  | ||||||
| 		await models.set(await getModels()); |  | ||||||
| 		await modelfiles.set(JSON.parse(localStorage.getItem('modelfiles') ?? '[]')); |  | ||||||
| 
 |  | ||||||
| 		modelfiles.subscribe(async () => { |  | ||||||
| 			// should fetch models |  | ||||||
| 		}); |  | ||||||
| 
 |  | ||||||
| 		await setOllamaVersion(); |  | ||||||
| 
 |  | ||||||
| 		await tick(); |  | ||||||
| 		loaded = true; | 		loaded = true; | ||||||
| 	}); | 	}); | ||||||
| 
 |  | ||||||
| 	let child; |  | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| {#if loaded} | {#if loaded} | ||||||
|  | @ -121,7 +122,7 @@ | ||||||
| 					</div> | 					</div> | ||||||
| 				</div> | 				</div> | ||||||
| 			</div> | 			</div> | ||||||
| 		{:else if ($info?.ollama?.version ?? '0').localeCompare( REQUIRED_OLLAMA_VERSION, undefined, { numeric: true, sensitivity: 'case', caseFirst: 'upper' } ) < 0} | 		{:else if checkVersion(REQUIRED_OLLAMA_VERSION, ollamaVersion ?? '0')} | ||||||
| 			<div class="absolute w-full h-full flex z-50"> | 			<div class="absolute w-full h-full flex z-50"> | ||||||
| 				<div | 				<div | ||||||
| 					class="absolute rounded-xl w-full h-full backdrop-blur bg-gray-900/60 flex justify-center" | 					class="absolute rounded-xl w-full h-full backdrop-blur bg-gray-900/60 flex justify-center" | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Timothy J. Baek
						Timothy J. Baek